/*
 MIT License

 Copyright (c) 2018-2020 Yuki Koyama

 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
 in the Software without restriction, including without limitation the rights
 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:

 The above copyright notice and this permission notice shall be included in all
 copies or substantial portions of the Software.

 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 SOFTWARE.

 -------------------------------------------------------------------------------

 The lookup table for Turbo is derived by Shot511 in his PR,
 https://github.com/yuki-koyama/tinycolormap/pull/27 , from
 https://gist.github.com/mikhailov-work/6a308c20e494d9e0ccc29036b28faa7a , which
 is released by Anton Mikhailov, copyrighted by Google LLC, and licensed under
 the Apache 2.0 license. To the best of our knowledge, the Apache 2.0 license is
 compatible with the MIT license, and thus we release the merged entire code
 under the MIT license. The license notice for Anton's code is posted here:

 Copyright 2019 Google LLC.

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
     http://www.apache.org/licenses/LICENSE-2.0
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.

 */

#ifndef TINYCOLORMAP_HPP_
#define TINYCOLORMAP_HPP_

#include <cmath>
#include <cstdint>
#include <algorithm>

#if defined(TINYCOLORMAP_WITH_EIGEN)

#include <Eigen/Core>

#endif

#if defined(TINYCOLORMAP_WITH_QT5)
#include <QColor>
#endif

#if defined(TINYCOLORMAP_WITH_QT5) && defined(TINYCOLORMAP_WITH_EIGEN)
                                                                                                                        #include <QImage>
#include <QString>
#endif

#if defined(TINYCOLORMAP_WITH_GLM)
#include <glm/vec3.hpp>
#endif

namespace tinycolormap {
    //////////////////////////////////////////////////////////////////////////////////
    // Interface
    //////////////////////////////////////////////////////////////////////////////////

    enum class ColormapType {
        Parula, Heat, Jet, Turbo, Hot, Gray, Magma, Inferno, Plasma, Viridis, Cividis, Github, Hsv
    };

    struct Color {
        explicit constexpr Color(double gray) noexcept: data{gray, gray, gray} {}

        constexpr Color(double r, double g, double b) noexcept: data{r, g, b} {}

        double data[3];

        double &r() noexcept { return data[0]; }

        double &g() noexcept { return data[1]; }

        double &b() noexcept { return data[2]; }

        constexpr double r() const noexcept { return data[0]; }

        constexpr double g() const noexcept { return data[1]; }

        constexpr double b() const noexcept { return data[2]; }

        constexpr uint8_t ri() const noexcept { return static_cast<uint8_t>(data[0] * 255.0); }

        constexpr uint8_t gi() const noexcept { return static_cast<uint8_t>(data[1] * 255.0); }

        constexpr uint8_t bi() const noexcept { return static_cast<uint8_t>(data[2] * 255.0); }

        double &operator[](std::size_t n) noexcept { return data[n]; }

        constexpr double operator[](std::size_t n) const noexcept { return data[n]; }

        double &operator()(std::size_t n) noexcept { return data[n]; }

        constexpr double operator()(std::size_t n) const noexcept { return data[n]; }

        friend constexpr Color operator+(const Color &c0, const Color &c1) noexcept {
            return {c0.r() + c1.r(), c0.g() + c1.g(), c0.b() + c1.b()};
        }

        friend constexpr Color operator*(double s, const Color &c) noexcept {
            return {s * c.r(), s * c.g(), s * c.b()};
        }

#if defined(TINYCOLORMAP_WITH_QT5)
        QColor ConvertToQColor() const { return QColor(data[0] * 255.0, data[1] * 255.0, data[2] * 255.0); }
#endif
#if defined(TINYCOLORMAP_WITH_EIGEN)

        Eigen::Vector3d ConvertToEigen() const { return Eigen::Vector3d(data[0], data[1], data[2]); }

#endif
#if defined(TINYCOLORMAP_WITH_GLM)
        glm::vec3 ConvertToGLM() const { return glm::vec3(data[0], data[1], data[2]); }
#endif
    };

    inline Color GetColor(double x, ColormapType type = ColormapType::Viridis);

    inline Color GetQuantizedColor(double x, unsigned int num_levels, ColormapType type = ColormapType::Viridis);

    inline Color GetParulaColor(double x);

    inline Color GetHeatColor(double x);

    inline Color GetJetColor(double x);

    inline Color GetTurboColor(double x);

    inline Color GetHotColor(double x);

    inline constexpr Color GetGrayColor(double x) noexcept;

    inline Color GetMagmaColor(double x);

    inline Color GetInfernoColor(double x);

    inline Color GetPlasmaColor(double x);

    inline Color GetViridisColor(double x);

    inline Color GetCividisColor(double x);

    inline Color GetGithubColor(double x);

    inline Color GetHsvColor(double x);

    inline Color GetHexColor(double x, const std::vector<int> &hex_colors);

#if defined(TINYCOLORMAP_WITH_QT5) && defined(TINYCOLORMAP_WITH_EIGEN)
                                                                                                                            inline QImage CreateMatrixVisualization(const Eigen::MatrixXd& matrix);
    inline void ExportMatrixVisualization(const Eigen::MatrixXd& matrix, const std::string& path);
#endif

    //////////////////////////////////////////////////////////////////////////////////
    // Private Implementation - public usage is not intended
    //////////////////////////////////////////////////////////////////////////////////

    namespace internal {
        inline constexpr double Clamp01(double x) noexcept {
            return (x < 0.0) ? 0.0 : (x > 1.0) ? 1.0 : x;
        }

        // A helper function to calculate linear interpolation
        template<std::size_t N>
        Color CalcLerp(double x, const Color (&data)[N]) {
            const double a = Clamp01(x) * (N - 1);
            const double i = std::floor(a);
            const double t = a - i;
            const Color &c0 = data[static_cast<std::size_t>(i)];
            const Color &c1 = data[static_cast<std::size_t>(std::ceil(a))];

            return (1.0 - t) * c0 + t * c1;
        }


        inline double QuantizeArgument(double x, unsigned int num_levels) {
            // Clamp num_classes to range [1, 255].
            num_levels = (std::max)(1u, (std::min)(num_levels, 255u));

            const double interval_length = 255.0 / num_levels;

            // Calculate index of the interval to which the given x belongs to.
            // Substracting eps prevents getting out of bounds index.
            constexpr double eps = 0.0005;
            const unsigned int index = static_cast<unsigned int>((x * 255.0 - eps) / interval_length);

            // Calculate upper and lower bounds of the given interval.
            const unsigned int upper_boundary = static_cast<unsigned int>(index * interval_length + interval_length);
            const unsigned int lower_boundary = static_cast<unsigned int>(upper_boundary - interval_length);

            // Get middle "coordinate" of the given interval and move it back to [0.0, 1.0] interval.
            const double xx = static_cast<double>(upper_boundary + lower_boundary) * 0.5 / 255.0;

            return xx;
        }
    }

    //////////////////////////////////////////////////////////////////////////////////
    // Public Implementation
    //////////////////////////////////////////////////////////////////////////////////


    inline Color GetColor(double x, ColormapType type) {
        switch (type) {
            case ColormapType::Parula:
                return GetParulaColor(x);
            case ColormapType::Heat:
                return GetHeatColor(x);
            case ColormapType::Jet:
                return GetJetColor(x);
            case ColormapType::Turbo:
                return GetTurboColor(x);
            case ColormapType::Hot:
                return GetHotColor(x);
            case ColormapType::Gray:
                return GetGrayColor(x);
            case ColormapType::Magma:
                return GetMagmaColor(x);
            case ColormapType::Inferno:
                return GetInfernoColor(x);
            case ColormapType::Plasma:
                return GetPlasmaColor(x);
            case ColormapType::Viridis:
                return GetViridisColor(x);
            case ColormapType::Cividis:
                return GetCividisColor(x);
            case ColormapType::Github:
                return GetGithubColor(x);
            case ColormapType::Hsv:
                return GetHsvColor(x);
            default:
                break;
        }

        return GetViridisColor(x);
    }

    inline Color GetQuantizedColor(double x, unsigned int num_levels, ColormapType type) {
        return GetColor(internal::QuantizeArgument(x, num_levels), type);
    }


    inline Color GetParulaColor(double x) {
        constexpr Color data[] =
                {
                        {0.2081, 0.1663, 0.5292},
                        {0.2091, 0.1721, 0.5411},
                        {0.2101, 0.1779, 0.553},
                        {0.2109, 0.1837, 0.565},
                        {0.2116, 0.1895, 0.5771},
                        {0.2121, 0.1954, 0.5892},
                        {0.2124, 0.2013, 0.6013},
                        {0.2125, 0.2072, 0.6135},
                        {0.2123, 0.2132, 0.6258},
                        {0.2118, 0.2192, 0.6381},
                        {0.2111, 0.2253, 0.6505},
                        {0.2099, 0.2315, 0.6629},
                        {0.2084, 0.2377, 0.6753},
                        {0.2063, 0.244,  0.6878},
                        {0.2038, 0.2503, 0.7003},
                        {0.2006, 0.2568, 0.7129},
                        {0.1968, 0.2632, 0.7255},
                        {0.1921, 0.2698, 0.7381},
                        {0.1867, 0.2764, 0.7507},
                        {0.1802, 0.2832, 0.7634},
                        {0.1728, 0.2902, 0.7762},
                        {0.1641, 0.2975, 0.789},
                        {0.1541, 0.3052, 0.8017},
                        {0.1427, 0.3132, 0.8145},
                        {0.1295, 0.3217, 0.8269},
                        {0.1147, 0.3306, 0.8387},
                        {0.0986, 0.3397, 0.8495},
                        {0.0816, 0.3486, 0.8588},
                        {0.0646, 0.3572, 0.8664},
                        {0.0482, 0.3651, 0.8722},
                        {0.0329, 0.3724, 0.8765},
                        {0.0213, 0.3792, 0.8796},
                        {0.0136, 0.3853, 0.8815},
                        {0.0086, 0.3911, 0.8827},
                        {0.006,  0.3965, 0.8833},
                        {0.0051, 0.4017, 0.8834},
                        {0.0054, 0.4066, 0.8831},
                        {0.0067, 0.4113, 0.8825},
                        {0.0089, 0.4159, 0.8816},
                        {0.0116, 0.4203, 0.8805},
                        {0.0148, 0.4246, 0.8793},
                        {0.0184, 0.4288, 0.8779},
                        {0.0223, 0.4329, 0.8763},
                        {0.0264, 0.437,  0.8747},
                        {0.0306, 0.441,  0.8729},
                        {0.0349, 0.4449, 0.8711},
                        {0.0394, 0.4488, 0.8692},
                        {0.0437, 0.4526, 0.8672},
                        {0.0477, 0.4564, 0.8652},
                        {0.0514, 0.4602, 0.8632},
                        {0.0549, 0.464,  0.8611},
                        {0.0582, 0.4677, 0.8589},
                        {0.0612, 0.4714, 0.8568},
                        {0.064,  0.4751, 0.8546},
                        {0.0666, 0.4788, 0.8525},
                        {0.0689, 0.4825, 0.8503},
                        {0.071,  0.4862, 0.8481},
                        {0.0729, 0.4899, 0.846},
                        {0.0746, 0.4937, 0.8439},
                        {0.0761, 0.4974, 0.8418},
                        {0.0773, 0.5012, 0.8398},
                        {0.0782, 0.5051, 0.8378},
                        {0.0789, 0.5089, 0.8359},
                        {0.0794, 0.5129, 0.8341},
                        {0.0795, 0.5169, 0.8324},
                        {0.0793, 0.521,  0.8308},
                        {0.0788, 0.5251, 0.8293},
                        {0.0778, 0.5295, 0.828},
                        {0.0764, 0.5339, 0.827},
                        {0.0746, 0.5384, 0.8261},
                        {0.0724, 0.5431, 0.8253},
                        {0.0698, 0.5479, 0.8247},
                        {0.0668, 0.5527, 0.8243},
                        {0.0636, 0.5577, 0.8239},
                        {0.06,   0.5627, 0.8237},
                        {0.0562, 0.5677, 0.8234},
                        {0.0523, 0.5727, 0.8231},
                        {0.0484, 0.5777, 0.8228},
                        {0.0445, 0.5826, 0.8223},
                        {0.0408, 0.5874, 0.8217},
                        {0.0372, 0.5922, 0.8209},
                        {0.0342, 0.5968, 0.8198},
                        {0.0317, 0.6012, 0.8186},
                        {0.0296, 0.6055, 0.8171},
                        {0.0279, 0.6097, 0.8154},
                        {0.0265, 0.6137, 0.8135},
                        {0.0255, 0.6176, 0.8114},
                        {0.0248, 0.6214, 0.8091},
                        {0.0243, 0.625,  0.8066},
                        {0.0239, 0.6285, 0.8039},
                        {0.0237, 0.6319, 0.801},
                        {0.0235, 0.6352, 0.798},
                        {0.0233, 0.6384, 0.7948},
                        {0.0231, 0.6415, 0.7916},
                        {0.023,  0.6445, 0.7881},
                        {0.0229, 0.6474, 0.7846},
                        {0.0227, 0.6503, 0.781,},
                        {0.0227, 0.6531, 0.7773},
                        {0.0232, 0.6558, 0.7735},
                        {0.0238, 0.6585, 0.7696},
                        {0.0246, 0.6611, 0.7656},
                        {0.0263, 0.6637, 0.7615},
                        {0.0282, 0.6663, 0.7574},
                        {0.0306, 0.6688, 0.7532},
                        {0.0338, 0.6712, 0.749},
                        {0.0373, 0.6737, 0.7446},
                        {0.0418, 0.6761, 0.7402},
                        {0.0467, 0.6784, 0.7358},
                        {0.0516, 0.6808, 0.7313},
                        {0.0574, 0.6831, 0.7267},
                        {0.0629, 0.6854, 0.7221},
                        {0.0692, 0.6877, 0.7173},
                        {0.0755, 0.6899, 0.7126},
                        {0.082,  0.6921, 0.7078},
                        {0.0889, 0.6943, 0.7029},
                        {0.0956, 0.6965, 0.6979},
                        {0.1031, 0.6986, 0.6929},
                        {0.1104, 0.7007, 0.6878},
                        {0.118,  0.7028, 0.6827},
                        {0.1258, 0.7049, 0.6775},
                        {0.1335, 0.7069, 0.6723},
                        {0.1418, 0.7089, 0.6669},
                        {0.1499, 0.7109, 0.6616},
                        {0.1585, 0.7129, 0.6561},
                        {0.1671, 0.7148, 0.6507},
                        {0.1758, 0.7168, 0.6451},
                        {0.1849, 0.7186, 0.6395},
                        {0.1938, 0.7205, 0.6338},
                        {0.2033, 0.7223, 0.6281},
                        {0.2128, 0.7241, 0.6223},
                        {0.2224, 0.7259, 0.6165},
                        {0.2324, 0.7275, 0.6107},
                        {0.2423, 0.7292, 0.6048},
                        {0.2527, 0.7308, 0.5988},
                        {0.2631, 0.7324, 0.5929},
                        {0.2735, 0.7339, 0.5869},
                        {0.2845, 0.7354, 0.5809},
                        {0.2953, 0.7368, 0.5749},
                        {0.3064, 0.7381, 0.5689},
                        {0.3177, 0.7394, 0.563},
                        {0.3289, 0.7406, 0.557},
                        {0.3405, 0.7417, 0.5512},
                        {0.352,  0.7428, 0.5453},
                        {0.3635, 0.7438, 0.5396},
                        {0.3753, 0.7446, 0.5339},
                        {0.3869, 0.7454, 0.5283},
                        {0.3986, 0.7461, 0.5229},
                        {0.4103, 0.7467, 0.5175},
                        {0.4218, 0.7473, 0.5123},
                        {0.4334, 0.7477, 0.5072},
                        {0.4447, 0.7482, 0.5021},
                        {0.4561, 0.7485, 0.4972},
                        {0.4672, 0.7487, 0.4924},
                        {0.4783, 0.7489, 0.4877},
                        {0.4892, 0.7491, 0.4831},
                        {0.5,    0.7491, 0.4786},
                        {0.5106, 0.7492, 0.4741},
                        {0.5212, 0.7492, 0.4698},
                        {0.5315, 0.7491, 0.4655},
                        {0.5418, 0.749,  0.4613},
                        {0.5519, 0.7489, 0.4571},
                        {0.5619, 0.7487, 0.4531},
                        {0.5718, 0.7485, 0.449},
                        {0.5816, 0.7482, 0.4451},
                        {0.5913, 0.7479, 0.4412},
                        {0.6009, 0.7476, 0.4374},
                        {0.6103, 0.7473, 0.4335},
                        {0.6197, 0.7469, 0.4298},
                        {0.629,  0.7465, 0.4261},
                        {0.6382, 0.746,  0.4224},
                        {0.6473, 0.7456, 0.4188},
                        {0.6564, 0.7451, 0.4152},
                        {0.6653, 0.7446, 0.4116},
                        {0.6742, 0.7441, 0.4081},
                        {0.683,  0.7435, 0.4046},
                        {0.6918, 0.743,  0.4011},
                        {0.7004, 0.7424, 0.3976},
                        {0.7091, 0.7418, 0.3942},
                        {0.7176, 0.7412, 0.3908},
                        {0.7261, 0.7405, 0.3874},
                        {0.7346, 0.7399, 0.384},
                        {0.743,  0.7392, 0.3806},
                        {0.7513, 0.7385, 0.3773},
                        {0.7596, 0.7378, 0.3739},
                        {0.7679, 0.7372, 0.3706},
                        {0.7761, 0.7364, 0.3673},
                        {0.7843, 0.7357, 0.3639},
                        {0.7924, 0.735,  0.3606},
                        {0.8005, 0.7343, 0.3573},
                        {0.8085, 0.7336, 0.3539},
                        {0.8166, 0.7329, 0.3506},
                        {0.8246, 0.7322, 0.3472},
                        {0.8325, 0.7315, 0.3438},
                        {0.8405, 0.7308, 0.3404},
                        {0.8484, 0.7301, 0.337},
                        {0.8563, 0.7294, 0.3336},
                        {0.8642, 0.7288, 0.33},
                        {0.872,  0.7282, 0.3265},
                        {0.8798, 0.7276, 0.3229},
                        {0.8877, 0.7271, 0.3193},
                        {0.8954, 0.7266, 0.3156},
                        {0.9032, 0.7262, 0.3117},
                        {0.911,  0.7259, 0.3078},
                        {0.9187, 0.7256, 0.3038},
                        {0.9264, 0.7256, 0.2996},
                        {0.9341, 0.7256, 0.2953},
                        {0.9417, 0.7259, 0.2907},
                        {0.9493, 0.7264, 0.2859},
                        {0.9567, 0.7273, 0.2808},
                        {0.9639, 0.7285, 0.2754},
                        {0.9708, 0.7303, 0.2696},
                        {0.9773, 0.7326, 0.2634},
                        {0.9831, 0.7355, 0.257},
                        {0.9882, 0.739,  0.2504},
                        {0.9922, 0.7431, 0.2437},
                        {0.9952, 0.7476, 0.2373},
                        {0.9973, 0.7524, 0.231},
                        {0.9986, 0.7573, 0.2251},
                        {0.9991, 0.7624, 0.2195},
                        {0.999,  0.7675, 0.2141},
                        {0.9985, 0.7726, 0.209},
                        {0.9976, 0.7778, 0.2042},
                        {0.9964, 0.7829, 0.1995},
                        {0.995,  0.788,  0.1949},
                        {0.9933, 0.7931, 0.1905},
                        {0.9914, 0.7981, 0.1863},
                        {0.9894, 0.8032, 0.1821},
                        {0.9873, 0.8083, 0.178},
                        {0.9851, 0.8133, 0.174},
                        {0.9828, 0.8184, 0.17},
                        {0.9805, 0.8235, 0.1661},
                        {0.9782, 0.8286, 0.1622},
                        {0.9759, 0.8337, 0.1583},
                        {0.9736, 0.8389, 0.1544},
                        {0.9713, 0.8441, 0.1505},
                        {0.9692, 0.8494, 0.1465},
                        {0.9672, 0.8548, 0.1425},
                        {0.9654, 0.8603, 0.1385},
                        {0.9638, 0.8659, 0.1343},
                        {0.9623, 0.8716, 0.1301},
                        {0.9611, 0.8774, 0.1258},
                        {0.96,   0.8834, 0.1215},
                        {0.9593, 0.8895, 0.1171},
                        {0.9588, 0.8958, 0.1126},
                        {0.9586, 0.9022, 0.1082},
                        {0.9587, 0.9088, 0.1036},
                        {0.9591, 0.9155, 0.099},
                        {0.9599, 0.9225, 0.0944},
                        {0.961,  0.9296, 0.0897},
                        {0.9624, 0.9368, 0.085},
                        {0.9641, 0.9443, 0.0802},
                        {0.9662, 0.9518, 0.0753},
                        {0.9685, 0.9595, 0.0703},
                        {0.971,  0.9673, 0.0651},
                        {0.9736, 0.9752, 0.0597},
                        {0.9763, 0.9831, 0.0538}
                };

        return internal::CalcLerp(x, data);
    }

    inline Color GetHeatColor(double x) {
        constexpr Color data[] =
                {
                        {0.0, 0.0, 1.0},
                        {0.0, 1.0, 1.0},
                        {0.0, 1.0, 0.0},
                        {1.0, 1.0, 0.0},
                        {1.0, 0.0, 0.0}
                };

        return internal::CalcLerp(x, data);
    }

    inline Color GetJetColor(double x) {
        constexpr Color data[] =
                {
                        {0.0, 0.0, 0.5},
                        {0.0, 0.0, 1.0},
                        {0.0, 0.5, 1.0},
                        {0.0, 1.0, 1.0},
                        {0.5, 1.0, 0.5},
                        {1.0, 1.0, 0.0},
                        {1.0, 0.5, 0.0},
                        {1.0, 0.0, 0.0},
                        {0.5, 0.0, 0.0}
                };

        return internal::CalcLerp(x, data);
    }

    inline Color GetTurboColor(double x) {
        constexpr Color data[] =
                {
                        {0.18995, 0.07176, 0.23217},
                        {0.19483, 0.08339, 0.26149},
                        {0.19956, 0.09498, 0.29024},
                        {0.20415, 0.10652, 0.31844},
                        {0.20860, 0.11802, 0.34607},
                        {0.21291, 0.12947, 0.37314},
                        {0.21708, 0.14087, 0.39964},
                        {0.22111, 0.15223, 0.42558},
                        {0.22500, 0.16354, 0.45096},
                        {0.22875, 0.17481, 0.47578},
                        {0.23236, 0.18603, 0.50004},
                        {0.23582, 0.19720, 0.52373},
                        {0.23915, 0.20833, 0.54686},
                        {0.24234, 0.21941, 0.56942},
                        {0.24539, 0.23044, 0.59142},
                        {0.24830, 0.24143, 0.61286},
                        {0.25107, 0.25237, 0.63374},
                        {0.25369, 0.26327, 0.65406},
                        {0.25618, 0.27412, 0.67381},
                        {0.25853, 0.28492, 0.69300},
                        {0.26074, 0.29568, 0.71162},
                        {0.26280, 0.30639, 0.72968},
                        {0.26473, 0.31706, 0.74718},
                        {0.26652, 0.32768, 0.76412},
                        {0.26816, 0.33825, 0.78050},
                        {0.26967, 0.34878, 0.79631},
                        {0.27103, 0.35926, 0.81156},
                        {0.27226, 0.36970, 0.82624},
                        {0.27334, 0.38008, 0.84037},
                        {0.27429, 0.39043, 0.85393},
                        {0.27509, 0.40072, 0.86692},
                        {0.27576, 0.41097, 0.87936},
                        {0.27628, 0.42118, 0.89123},
                        {0.27667, 0.43134, 0.90254},
                        {0.27691, 0.44145, 0.91328},
                        {0.27701, 0.45152, 0.92347},
                        {0.27698, 0.46153, 0.93309},
                        {0.27680, 0.47151, 0.94214},
                        {0.27648, 0.48144, 0.95064},
                        {0.27603, 0.49132, 0.95857},
                        {0.27543, 0.50115, 0.96594},
                        {0.27469, 0.51094, 0.97275},
                        {0.27381, 0.52069, 0.97899},
                        {0.27273, 0.53040, 0.98461},
                        {0.27106, 0.54015, 0.98930},
                        {0.26878, 0.54995, 0.99303},
                        {0.26592, 0.55979, 0.99583},
                        {0.26252, 0.56967, 0.99773},
                        {0.25862, 0.57958, 0.99876},
                        {0.25425, 0.58950, 0.99896},
                        {0.24946, 0.59943, 0.99835},
                        {0.24427, 0.60937, 0.99697},
                        {0.23874, 0.61931, 0.99485},
                        {0.23288, 0.62923, 0.99202},
                        {0.22676, 0.63913, 0.98851},
                        {0.22039, 0.64901, 0.98436},
                        {0.21382, 0.65886, 0.97959},
                        {0.20708, 0.66866, 0.97423},
                        {0.20021, 0.67842, 0.96833},
                        {0.19326, 0.68812, 0.96190},
                        {0.18625, 0.69775, 0.95498},
                        {0.17923, 0.70732, 0.94761},
                        {0.17223, 0.71680, 0.93981},
                        {0.16529, 0.72620, 0.93161},
                        {0.15844, 0.73551, 0.92305},
                        {0.15173, 0.74472, 0.91416},
                        {0.14519, 0.75381, 0.90496},
                        {0.13886, 0.76279, 0.89550},
                        {0.13278, 0.77165, 0.88580},
                        {0.12698, 0.78037, 0.87590},
                        {0.12151, 0.78896, 0.86581},
                        {0.11639, 0.79740, 0.85559},
                        {0.11167, 0.80569, 0.84525},
                        {0.10738, 0.81381, 0.83484},
                        {0.10357, 0.82177, 0.82437},
                        {0.10026, 0.82955, 0.81389},
                        {0.09750, 0.83714, 0.80342},
                        {0.09532, 0.84455, 0.79299},
                        {0.09377, 0.85175, 0.78264},
                        {0.09287, 0.85875, 0.77240},
                        {0.09267, 0.86554, 0.76230},
                        {0.09320, 0.87211, 0.75237},
                        {0.09451, 0.87844, 0.74265},
                        {0.09662, 0.88454, 0.73316},
                        {0.09958, 0.89040, 0.72393},
                        {0.10342, 0.89600, 0.71500},
                        {0.10815, 0.90142, 0.70599},
                        {0.11374, 0.90673, 0.69651},
                        {0.12014, 0.91193, 0.68660},
                        {0.12733, 0.91701, 0.67627},
                        {0.13526, 0.92197, 0.66556},
                        {0.14391, 0.92680, 0.65448},
                        {0.15323, 0.93151, 0.64308},
                        {0.16319, 0.93609, 0.63137},
                        {0.17377, 0.94053, 0.61938},
                        {0.18491, 0.94484, 0.60713},
                        {0.19659, 0.94901, 0.59466},
                        {0.20877, 0.95304, 0.58199},
                        {0.22142, 0.95692, 0.56914},
                        {0.23449, 0.96065, 0.55614},
                        {0.24797, 0.96423, 0.54303},
                        {0.26180, 0.96765, 0.52981},
                        {0.27597, 0.97092, 0.51653},
                        {0.29042, 0.97403, 0.50321},
                        {0.30513, 0.97697, 0.48987},
                        {0.32006, 0.97974, 0.47654},
                        {0.33517, 0.98234, 0.46325},
                        {0.35043, 0.98477, 0.45002},
                        {0.36581, 0.98702, 0.43688},
                        {0.38127, 0.98909, 0.42386},
                        {0.39678, 0.99098, 0.41098},
                        {0.41229, 0.99268, 0.39826},
                        {0.42778, 0.99419, 0.38575},
                        {0.44321, 0.99551, 0.37345},
                        {0.45854, 0.99663, 0.36140},
                        {0.47375, 0.99755, 0.34963},
                        {0.48879, 0.99828, 0.33816},
                        {0.50362, 0.99879, 0.32701},
                        {0.51822, 0.99910, 0.31622},
                        {0.53255, 0.99919, 0.30581},
                        {0.54658, 0.99907, 0.29581},
                        {0.56026, 0.99873, 0.28623},
                        {0.57357, 0.99817, 0.27712},
                        {0.58646, 0.99739, 0.26849},
                        {0.59891, 0.99638, 0.26038},
                        {0.61088, 0.99514, 0.25280},
                        {0.62233, 0.99366, 0.24579},
                        {0.63323, 0.99195, 0.23937},
                        {0.64362, 0.98999, 0.23356},
                        {0.65394, 0.98775, 0.22835},
                        {0.66428, 0.98524, 0.22370},
                        {0.67462, 0.98246, 0.21960},
                        {0.68494, 0.97941, 0.21602},
                        {0.69525, 0.97610, 0.21294},
                        {0.70553, 0.97255, 0.21032},
                        {0.71577, 0.96875, 0.20815},
                        {0.72596, 0.96470, 0.20640},
                        {0.73610, 0.96043, 0.20504},
                        {0.74617, 0.95593, 0.20406},
                        {0.75617, 0.95121, 0.20343},
                        {0.76608, 0.94627, 0.20311},
                        {0.77591, 0.94113, 0.20310},
                        {0.78563, 0.93579, 0.20336},
                        {0.79524, 0.93025, 0.20386},
                        {0.80473, 0.92452, 0.20459},
                        {0.81410, 0.91861, 0.20552},
                        {0.82333, 0.91253, 0.20663},
                        {0.83241, 0.90627, 0.20788},
                        {0.84133, 0.89986, 0.20926},
                        {0.85010, 0.89328, 0.21074},
                        {0.85868, 0.88655, 0.21230},
                        {0.86709, 0.87968, 0.21391},
                        {0.87530, 0.87267, 0.21555},
                        {0.88331, 0.86553, 0.21719},
                        {0.89112, 0.85826, 0.21880},
                        {0.89870, 0.85087, 0.22038},
                        {0.90605, 0.84337, 0.22188},
                        {0.91317, 0.83576, 0.22328},
                        {0.92004, 0.82806, 0.22456},
                        {0.92666, 0.82025, 0.22570},
                        {0.93301, 0.81236, 0.22667},
                        {0.93909, 0.80439, 0.22744},
                        {0.94489, 0.79634, 0.22800},
                        {0.95039, 0.78823, 0.22831},
                        {0.95560, 0.78005, 0.22836},
                        {0.96049, 0.77181, 0.22811},
                        {0.96507, 0.76352, 0.22754},
                        {0.96931, 0.75519, 0.22663},
                        {0.97323, 0.74682, 0.22536},
                        {0.97679, 0.73842, 0.22369},
                        {0.98000, 0.73000, 0.22161},
                        {0.98289, 0.72140, 0.21918},
                        {0.98549, 0.71250, 0.21650},
                        {0.98781, 0.70330, 0.21358},
                        {0.98986, 0.69382, 0.21043},
                        {0.99163, 0.68408, 0.20706},
                        {0.99314, 0.67408, 0.20348},
                        {0.99438, 0.66386, 0.19971},
                        {0.99535, 0.65341, 0.19577},
                        {0.99607, 0.64277, 0.19165},
                        {0.99654, 0.63193, 0.18738},
                        {0.99675, 0.62093, 0.18297},
                        {0.99672, 0.60977, 0.17842},
                        {0.99644, 0.59846, 0.17376},
                        {0.99593, 0.58703, 0.16899},
                        {0.99517, 0.57549, 0.16412},
                        {0.99419, 0.56386, 0.15918},
                        {0.99297, 0.55214, 0.15417},
                        {0.99153, 0.54036, 0.14910},
                        {0.98987, 0.52854, 0.14398},
                        {0.98799, 0.51667, 0.13883},
                        {0.98590, 0.50479, 0.13367},
                        {0.98360, 0.49291, 0.12849},
                        {0.98108, 0.48104, 0.12332},
                        {0.97837, 0.46920, 0.11817},
                        {0.97545, 0.45740, 0.11305},
                        {0.97234, 0.44565, 0.10797},
                        {0.96904, 0.43399, 0.10294},
                        {0.96555, 0.42241, 0.09798},
                        {0.96187, 0.41093, 0.09310},
                        {0.95801, 0.39958, 0.08831},
                        {0.95398, 0.38836, 0.08362},
                        {0.94977, 0.37729, 0.07905},
                        {0.94538, 0.36638, 0.07461},
                        {0.94084, 0.35566, 0.07031},
                        {0.93612, 0.34513, 0.06616},
                        {0.93125, 0.33482, 0.06218},
                        {0.92623, 0.32473, 0.05837},
                        {0.92105, 0.31489, 0.05475},
                        {0.91572, 0.30530, 0.05134},
                        {0.91024, 0.29599, 0.04814},
                        {0.90463, 0.28696, 0.04516},
                        {0.89888, 0.27824, 0.04243},
                        {0.89298, 0.26981, 0.03993},
                        {0.88691, 0.26152, 0.03753},
                        {0.88066, 0.25334, 0.03521},
                        {0.87422, 0.24526, 0.03297},
                        {0.86760, 0.23730, 0.03082},
                        {0.86079, 0.22945, 0.02875},
                        {0.85380, 0.22170, 0.02677},
                        {0.84662, 0.21407, 0.02487},
                        {0.83926, 0.20654, 0.02305},
                        {0.83172, 0.19912, 0.02131},
                        {0.82399, 0.19182, 0.01966},
                        {0.81608, 0.18462, 0.01809},
                        {0.80799, 0.17753, 0.01660},
                        {0.79971, 0.17055, 0.01520},
                        {0.79125, 0.16368, 0.01387},
                        {0.78260, 0.15693, 0.01264},
                        {0.77377, 0.15028, 0.01148},
                        {0.76476, 0.14374, 0.01041},
                        {0.75556, 0.13731, 0.00942},
                        {0.74617, 0.13098, 0.00851},
                        {0.73661, 0.12477, 0.00769},
                        {0.72686, 0.11867, 0.00695},
                        {0.71692, 0.11268, 0.00629},
                        {0.70680, 0.10680, 0.00571},
                        {0.69650, 0.10102, 0.00522},
                        {0.68602, 0.09536, 0.00481},
                        {0.67535, 0.08980, 0.00449},
                        {0.66449, 0.08436, 0.00424},
                        {0.65345, 0.07902, 0.00408},
                        {0.64223, 0.07380, 0.00401},
                        {0.63082, 0.06868, 0.00401},
                        {0.61923, 0.06367, 0.00410},
                        {0.60746, 0.05878, 0.00427},
                        {0.59550, 0.05399, 0.00453},
                        {0.58336, 0.04931, 0.00486},
                        {0.57103, 0.04474, 0.00529},
                        {0.55852, 0.04028, 0.00579},
                        {0.54583, 0.03593, 0.00638},
                        {0.53295, 0.03169, 0.00705},
                        {0.51989, 0.02756, 0.00780},
                        {0.50664, 0.02354, 0.00863},
                        {0.49321, 0.01963, 0.00955},
                        {0.47960, 0.01583, 0.01055}
                };

        return internal::CalcLerp(x, data);
    }

    inline Color GetHotColor(double x) {
        x = internal::Clamp01(x);

        constexpr Color r{1.0, 0.0, 0.0};
        constexpr Color g{0.0, 1.0, 0.0};
        constexpr Color b{0.0, 0.0, 1.0};

        if (x < 0.4) {
            const double t = x / 0.4;
            return t * r;
        } else if (x < 0.8) {
            const double t = (x - 0.4) / (0.8 - 0.4);
            return r + t * g;
        } else {
            const double t = (x - 0.8) / (1.0 - 0.8);
            return r + g + t * b;
        }
    }

    inline constexpr Color GetGrayColor(double x) noexcept {
        return Color{1.0 - internal::Clamp01(x)};
    }

    inline Color GetMagmaColor(double x) {
        constexpr Color data[] =
                {
                        {0.001462, 0.000466, 0.013866},
                        {0.002258, 0.001295, 0.018331},
                        {0.003279, 0.002305, 0.023708},
                        {0.004512, 0.003490, 0.029965},
                        {0.005950, 0.004843, 0.037130},
                        {0.007588, 0.006356, 0.044973},
                        {0.009426, 0.008022, 0.052844},
                        {0.011465, 0.009828, 0.060750},
                        {0.013708, 0.011771, 0.068667},
                        {0.016156, 0.013840, 0.076603},
                        {0.018815, 0.016026, 0.084584},
                        {0.021692, 0.018320, 0.092610},
                        {0.024792, 0.020715, 0.100676},
                        {0.028123, 0.023201, 0.108787},
                        {0.031696, 0.025765, 0.116965},
                        {0.035520, 0.028397, 0.125209},
                        {0.039608, 0.031090, 0.133515},
                        {0.043830, 0.033830, 0.141886},
                        {0.048062, 0.036607, 0.150327},
                        {0.052320, 0.039407, 0.158841},
                        {0.056615, 0.042160, 0.167446},
                        {0.060949, 0.044794, 0.176129},
                        {0.065330, 0.047318, 0.184892},
                        {0.069764, 0.049726, 0.193735},
                        {0.074257, 0.052017, 0.202660},
                        {0.078815, 0.054184, 0.211667},
                        {0.083446, 0.056225, 0.220755},
                        {0.088155, 0.058133, 0.229922},
                        {0.092949, 0.059904, 0.239164},
                        {0.097833, 0.061531, 0.248477},
                        {0.102815, 0.063010, 0.257854},
                        {0.107899, 0.064335, 0.267289},
                        {0.113094, 0.065492, 0.276784},
                        {0.118405, 0.066479, 0.286321},
                        {0.123833, 0.067295, 0.295879},
                        {0.129380, 0.067935, 0.305443},
                        {0.135053, 0.068391, 0.315000},
                        {0.140858, 0.068654, 0.324538},
                        {0.146785, 0.068738, 0.334011},
                        {0.152839, 0.068637, 0.343404},
                        {0.159018, 0.068354, 0.352688},
                        {0.165308, 0.067911, 0.361816},
                        {0.171713, 0.067305, 0.370771},
                        {0.178212, 0.066576, 0.379497},
                        {0.184801, 0.065732, 0.387973},
                        {0.191460, 0.064818, 0.396152},
                        {0.198177, 0.063862, 0.404009},
                        {0.204935, 0.062907, 0.411514},
                        {0.211718, 0.061992, 0.418647},
                        {0.218512, 0.061158, 0.425392},
                        {0.225302, 0.060445, 0.431742},
                        {0.232077, 0.059889, 0.437695},
                        {0.238826, 0.059517, 0.443256},
                        {0.245543, 0.059352, 0.448436},
                        {0.252220, 0.059415, 0.453248},
                        {0.258857, 0.059706, 0.457710},
                        {0.265447, 0.060237, 0.461840},
                        {0.271994, 0.060994, 0.465660},
                        {0.278493, 0.061978, 0.469190},
                        {0.284951, 0.063168, 0.472451},
                        {0.291366, 0.064553, 0.475462},
                        {0.297740, 0.066117, 0.478243},
                        {0.304081, 0.067835, 0.480812},
                        {0.310382, 0.069702, 0.483186},
                        {0.316654, 0.071690, 0.485380},
                        {0.322899, 0.073782, 0.487408},
                        {0.329114, 0.075972, 0.489287},
                        {0.335308, 0.078236, 0.491024},
                        {0.341482, 0.080564, 0.492631},
                        {0.347636, 0.082946, 0.494121},
                        {0.353773, 0.085373, 0.495501},
                        {0.359898, 0.087831, 0.496778},
                        {0.366012, 0.090314, 0.497960},
                        {0.372116, 0.092816, 0.499053},
                        {0.378211, 0.095332, 0.500067},
                        {0.384299, 0.097855, 0.501002},
                        {0.390384, 0.100379, 0.501864},
                        {0.396467, 0.102902, 0.502658},
                        {0.402548, 0.105420, 0.503386},
                        {0.408629, 0.107930, 0.504052},
                        {0.414709, 0.110431, 0.504662},
                        {0.420791, 0.112920, 0.505215},
                        {0.426877, 0.115395, 0.505714},
                        {0.432967, 0.117855, 0.506160},
                        {0.439062, 0.120298, 0.506555},
                        {0.445163, 0.122724, 0.506901},
                        {0.451271, 0.125132, 0.507198},
                        {0.457386, 0.127522, 0.507448},
                        {0.463508, 0.129893, 0.507652},
                        {0.469640, 0.132245, 0.507809},
                        {0.475780, 0.134577, 0.507921},
                        {0.481929, 0.136891, 0.507989},
                        {0.488088, 0.139186, 0.508011},
                        {0.494258, 0.141462, 0.507988},
                        {0.500438, 0.143719, 0.507920},
                        {0.506629, 0.145958, 0.507806},
                        {0.512831, 0.148179, 0.507648},
                        {0.519045, 0.150383, 0.507443},
                        {0.525270, 0.152569, 0.507192},
                        {0.531507, 0.154739, 0.506895},
                        {0.537755, 0.156894, 0.506551},
                        {0.544015, 0.159033, 0.506159},
                        {0.550287, 0.161158, 0.505719},
                        {0.556571, 0.163269, 0.505230},
                        {0.562866, 0.165368, 0.504692},
                        {0.569172, 0.167454, 0.504105},
                        {0.575490, 0.169530, 0.503466},
                        {0.581819, 0.171596, 0.502777},
                        {0.588158, 0.173652, 0.502035},
                        {0.594508, 0.175701, 0.501241},
                        {0.600868, 0.177743, 0.500394},
                        {0.607238, 0.179779, 0.499492},
                        {0.613617, 0.181811, 0.498536},
                        {0.620005, 0.183840, 0.497524},
                        {0.626401, 0.185867, 0.496456},
                        {0.632805, 0.187893, 0.495332},
                        {0.639216, 0.189921, 0.494150},
                        {0.645633, 0.191952, 0.492910},
                        {0.652056, 0.193986, 0.491611},
                        {0.658483, 0.196027, 0.490253},
                        {0.664915, 0.198075, 0.488836},
                        {0.671349, 0.200133, 0.487358},
                        {0.677786, 0.202203, 0.485819},
                        {0.684224, 0.204286, 0.484219},
                        {0.690661, 0.206384, 0.482558},
                        {0.697098, 0.208501, 0.480835},
                        {0.703532, 0.210638, 0.479049},
                        {0.709962, 0.212797, 0.477201},
                        {0.716387, 0.214982, 0.475290},
                        {0.722805, 0.217194, 0.473316},
                        {0.729216, 0.219437, 0.471279},
                        {0.735616, 0.221713, 0.469180},
                        {0.742004, 0.224025, 0.467018},
                        {0.748378, 0.226377, 0.464794},
                        {0.754737, 0.228772, 0.462509},
                        {0.761077, 0.231214, 0.460162},
                        {0.767398, 0.233705, 0.457755},
                        {0.773695, 0.236249, 0.455289},
                        {0.779968, 0.238851, 0.452765},
                        {0.786212, 0.241514, 0.450184},
                        {0.792427, 0.244242, 0.447543},
                        {0.798608, 0.247040, 0.444848},
                        {0.804752, 0.249911, 0.442102},
                        {0.810855, 0.252861, 0.439305},
                        {0.816914, 0.255895, 0.436461},
                        {0.822926, 0.259016, 0.433573},
                        {0.828886, 0.262229, 0.430644},
                        {0.834791, 0.265540, 0.427671},
                        {0.840636, 0.268953, 0.424666},
                        {0.846416, 0.272473, 0.421631},
                        {0.852126, 0.276106, 0.418573},
                        {0.857763, 0.279857, 0.415496},
                        {0.863320, 0.283729, 0.412403},
                        {0.868793, 0.287728, 0.409303},
                        {0.874176, 0.291859, 0.406205},
                        {0.879464, 0.296125, 0.403118},
                        {0.884651, 0.300530, 0.400047},
                        {0.889731, 0.305079, 0.397002},
                        {0.894700, 0.309773, 0.393995},
                        {0.899552, 0.314616, 0.391037},
                        {0.904281, 0.319610, 0.388137},
                        {0.908884, 0.324755, 0.385308},
                        {0.913354, 0.330052, 0.382563},
                        {0.917689, 0.335500, 0.379915},
                        {0.921884, 0.341098, 0.377376},
                        {0.925937, 0.346844, 0.374959},
                        {0.929845, 0.352734, 0.372677},
                        {0.933606, 0.358764, 0.370541},
                        {0.937221, 0.364929, 0.368567},
                        {0.940687, 0.371224, 0.366762},
                        {0.944006, 0.377643, 0.365136},
                        {0.947180, 0.384178, 0.363701},
                        {0.950210, 0.390820, 0.362468},
                        {0.953099, 0.397563, 0.361438},
                        {0.955849, 0.404400, 0.360619},
                        {0.958464, 0.411324, 0.360014},
                        {0.960949, 0.418323, 0.359630},
                        {0.963310, 0.425390, 0.359469},
                        {0.965549, 0.432519, 0.359529},
                        {0.967671, 0.439703, 0.359810},
                        {0.969680, 0.446936, 0.360311},
                        {0.971582, 0.454210, 0.361030},
                        {0.973381, 0.461520, 0.361965},
                        {0.975082, 0.468861, 0.363111},
                        {0.976690, 0.476226, 0.364466},
                        {0.978210, 0.483612, 0.366025},
                        {0.979645, 0.491014, 0.367783},
                        {0.981000, 0.498428, 0.369734},
                        {0.982279, 0.505851, 0.371874},
                        {0.983485, 0.513280, 0.374198},
                        {0.984622, 0.520713, 0.376698},
                        {0.985693, 0.528148, 0.379371},
                        {0.986700, 0.535582, 0.382210},
                        {0.987646, 0.543015, 0.385210},
                        {0.988533, 0.550446, 0.388365},
                        {0.989363, 0.557873, 0.391671},
                        {0.990138, 0.565296, 0.395122},
                        {0.990871, 0.572706, 0.398714},
                        {0.991558, 0.580107, 0.402441},
                        {0.992196, 0.587502, 0.406299},
                        {0.992785, 0.594891, 0.410283},
                        {0.993326, 0.602275, 0.414390},
                        {0.993834, 0.609644, 0.418613},
                        {0.994309, 0.616999, 0.422950},
                        {0.994738, 0.624350, 0.427397},
                        {0.995122, 0.631696, 0.431951},
                        {0.995480, 0.639027, 0.436607},
                        {0.995810, 0.646344, 0.441361},
                        {0.996096, 0.653659, 0.446213},
                        {0.996341, 0.660969, 0.451160},
                        {0.996580, 0.668256, 0.456192},
                        {0.996775, 0.675541, 0.461314},
                        {0.996925, 0.682828, 0.466526},
                        {0.997077, 0.690088, 0.471811},
                        {0.997186, 0.697349, 0.477182},
                        {0.997254, 0.704611, 0.482635},
                        {0.997325, 0.711848, 0.488154},
                        {0.997351, 0.719089, 0.493755},
                        {0.997351, 0.726324, 0.499428},
                        {0.997341, 0.733545, 0.505167},
                        {0.997285, 0.740772, 0.510983},
                        {0.997228, 0.747981, 0.516859},
                        {0.997138, 0.755190, 0.522806},
                        {0.997019, 0.762398, 0.528821},
                        {0.996898, 0.769591, 0.534892},
                        {0.996727, 0.776795, 0.541039},
                        {0.996571, 0.783977, 0.547233},
                        {0.996369, 0.791167, 0.553499},
                        {0.996162, 0.798348, 0.559820},
                        {0.995932, 0.805527, 0.566202},
                        {0.995680, 0.812706, 0.572645},
                        {0.995424, 0.819875, 0.579140},
                        {0.995131, 0.827052, 0.585701},
                        {0.994851, 0.834213, 0.592307},
                        {0.994524, 0.841387, 0.598983},
                        {0.994222, 0.848540, 0.605696},
                        {0.993866, 0.855711, 0.612482},
                        {0.993545, 0.862859, 0.619299},
                        {0.993170, 0.870024, 0.626189},
                        {0.992831, 0.877168, 0.633109},
                        {0.992440, 0.884330, 0.640099},
                        {0.992089, 0.891470, 0.647116},
                        {0.991688, 0.898627, 0.654202},
                        {0.991332, 0.905763, 0.661309},
                        {0.990930, 0.912915, 0.668481},
                        {0.990570, 0.920049, 0.675675},
                        {0.990175, 0.927196, 0.682926},
                        {0.989815, 0.934329, 0.690198},
                        {0.989434, 0.941470, 0.697519},
                        {0.989077, 0.948604, 0.704863},
                        {0.988717, 0.955742, 0.712242},
                        {0.988367, 0.962878, 0.719649},
                        {0.988033, 0.970012, 0.727077},
                        {0.987691, 0.977154, 0.734536},
                        {0.987387, 0.984288, 0.742002},
                        {0.987053, 0.991438, 0.749504}
                };

        return internal::CalcLerp(x, data);
    }

    inline Color GetInfernoColor(double x) {
        constexpr Color data[] =
                {
                        {0.001462, 0.000466, 0.013866},
                        {0.002267, 0.001270, 0.018570},
                        {0.003299, 0.002249, 0.024239},
                        {0.004547, 0.003392, 0.030909},
                        {0.006006, 0.004692, 0.038558},
                        {0.007676, 0.006136, 0.046836},
                        {0.009561, 0.007713, 0.055143},
                        {0.011663, 0.009417, 0.063460},
                        {0.013995, 0.011225, 0.071862},
                        {0.016561, 0.013136, 0.080282},
                        {0.019373, 0.015133, 0.088767},
                        {0.022447, 0.017199, 0.097327},
                        {0.025793, 0.019331, 0.105930},
                        {0.029432, 0.021503, 0.114621},
                        {0.033385, 0.023702, 0.123397},
                        {0.037668, 0.025921, 0.132232},
                        {0.042253, 0.028139, 0.141141},
                        {0.046915, 0.030324, 0.150164},
                        {0.051644, 0.032474, 0.159254},
                        {0.056449, 0.034569, 0.168414},
                        {0.061340, 0.036590, 0.177642},
                        {0.066331, 0.038504, 0.186962},
                        {0.071429, 0.040294, 0.196354},
                        {0.076637, 0.041905, 0.205799},
                        {0.081962, 0.043328, 0.215289},
                        {0.087411, 0.044556, 0.224813},
                        {0.092990, 0.045583, 0.234358},
                        {0.098702, 0.046402, 0.243904},
                        {0.104551, 0.047008, 0.253430},
                        {0.110536, 0.047399, 0.262912},
                        {0.116656, 0.047574, 0.272321},
                        {0.122908, 0.047536, 0.281624},
                        {0.129285, 0.047293, 0.290788},
                        {0.135778, 0.046856, 0.299776},
                        {0.142378, 0.046242, 0.308553},
                        {0.149073, 0.045468, 0.317085},
                        {0.155850, 0.044559, 0.325338},
                        {0.162689, 0.043554, 0.333277},
                        {0.169575, 0.042489, 0.340874},
                        {0.176493, 0.041402, 0.348111},
                        {0.183429, 0.040329, 0.354971},
                        {0.190367, 0.039309, 0.361447},
                        {0.197297, 0.038400, 0.367535},
                        {0.204209, 0.037632, 0.373238},
                        {0.211095, 0.037030, 0.378563},
                        {0.217949, 0.036615, 0.383522},
                        {0.224763, 0.036405, 0.388129},
                        {0.231538, 0.036405, 0.392400},
                        {0.238273, 0.036621, 0.396353},
                        {0.244967, 0.037055, 0.400007},
                        {0.251620, 0.037705, 0.403378},
                        {0.258234, 0.038571, 0.406485},
                        {0.264810, 0.039647, 0.409345},
                        {0.271347, 0.040922, 0.411976},
                        {0.277850, 0.042353, 0.414392},
                        {0.284321, 0.043933, 0.416608},
                        {0.290763, 0.045644, 0.418637},
                        {0.297178, 0.047470, 0.420491},
                        {0.303568, 0.049396, 0.422182},
                        {0.309935, 0.051407, 0.423721},
                        {0.316282, 0.053490, 0.425116},
                        {0.322610, 0.055634, 0.426377},
                        {0.328921, 0.057827, 0.427511},
                        {0.335217, 0.060060, 0.428524},
                        {0.341500, 0.062325, 0.429425},
                        {0.347771, 0.064616, 0.430217},
                        {0.354032, 0.066925, 0.430906},
                        {0.360284, 0.069247, 0.431497},
                        {0.366529, 0.071579, 0.431994},
                        {0.372768, 0.073915, 0.432400},
                        {0.379001, 0.076253, 0.432719},
                        {0.385228, 0.078591, 0.432955},
                        {0.391453, 0.080927, 0.433109},
                        {0.397674, 0.083257, 0.433183},
                        {0.403894, 0.085580, 0.433179},
                        {0.410113, 0.087896, 0.433098},
                        {0.416331, 0.090203, 0.432943},
                        {0.422549, 0.092501, 0.432714},
                        {0.428768, 0.094790, 0.432412},
                        {0.434987, 0.097069, 0.432039},
                        {0.441207, 0.099338, 0.431594},
                        {0.447428, 0.101597, 0.431080},
                        {0.453651, 0.103848, 0.430498},
                        {0.459875, 0.106089, 0.429846},
                        {0.466100, 0.108322, 0.429125},
                        {0.472328, 0.110547, 0.428334},
                        {0.478558, 0.112764, 0.427475},
                        {0.484789, 0.114974, 0.426548},
                        {0.491022, 0.117179, 0.425552},
                        {0.497257, 0.119379, 0.424488},
                        {0.503493, 0.121575, 0.423356},
                        {0.509730, 0.123769, 0.422156},
                        {0.515967, 0.125960, 0.420887},
                        {0.522206, 0.128150, 0.419549},
                        {0.528444, 0.130341, 0.418142},
                        {0.534683, 0.132534, 0.416667},
                        {0.540920, 0.134729, 0.415123},
                        {0.547157, 0.136929, 0.413511},
                        {0.553392, 0.139134, 0.411829},
                        {0.559624, 0.141346, 0.410078},
                        {0.565854, 0.143567, 0.408258},
                        {0.572081, 0.145797, 0.406369},
                        {0.578304, 0.148039, 0.404411},
                        {0.584521, 0.150294, 0.402385},
                        {0.590734, 0.152563, 0.400290},
                        {0.596940, 0.154848, 0.398125},
                        {0.603139, 0.157151, 0.395891},
                        {0.609330, 0.159474, 0.393589},
                        {0.615513, 0.161817, 0.391219},
                        {0.621685, 0.164184, 0.388781},
                        {0.627847, 0.166575, 0.386276},
                        {0.633998, 0.168992, 0.383704},
                        {0.640135, 0.171438, 0.381065},
                        {0.646260, 0.173914, 0.378359},
                        {0.652369, 0.176421, 0.375586},
                        {0.658463, 0.178962, 0.372748},
                        {0.664540, 0.181539, 0.369846},
                        {0.670599, 0.184153, 0.366879},
                        {0.676638, 0.186807, 0.363849},
                        {0.682656, 0.189501, 0.360757},
                        {0.688653, 0.192239, 0.357603},
                        {0.694627, 0.195021, 0.354388},
                        {0.700576, 0.197851, 0.351113},
                        {0.706500, 0.200728, 0.347777},
                        {0.712396, 0.203656, 0.344383},
                        {0.718264, 0.206636, 0.340931},
                        {0.724103, 0.209670, 0.337424},
                        {0.729909, 0.212759, 0.333861},
                        {0.735683, 0.215906, 0.330245},
                        {0.741423, 0.219112, 0.326576},
                        {0.747127, 0.222378, 0.322856},
                        {0.752794, 0.225706, 0.319085},
                        {0.758422, 0.229097, 0.315266},
                        {0.764010, 0.232554, 0.311399},
                        {0.769556, 0.236077, 0.307485},
                        {0.775059, 0.239667, 0.303526},
                        {0.780517, 0.243327, 0.299523},
                        {0.785929, 0.247056, 0.295477},
                        {0.791293, 0.250856, 0.291390},
                        {0.796607, 0.254728, 0.287264},
                        {0.801871, 0.258674, 0.283099},
                        {0.807082, 0.262692, 0.278898},
                        {0.812239, 0.266786, 0.274661},
                        {0.817341, 0.270954, 0.270390},
                        {0.822386, 0.275197, 0.266085},
                        {0.827372, 0.279517, 0.261750},
                        {0.832299, 0.283913, 0.257383},
                        {0.837165, 0.288385, 0.252988},
                        {0.841969, 0.292933, 0.248564},
                        {0.846709, 0.297559, 0.244113},
                        {0.851384, 0.302260, 0.239636},
                        {0.855992, 0.307038, 0.235133},
                        {0.860533, 0.311892, 0.230606},
                        {0.865006, 0.316822, 0.226055},
                        {0.869409, 0.321827, 0.221482},
                        {0.873741, 0.326906, 0.216886},
                        {0.878001, 0.332060, 0.212268},
                        {0.882188, 0.337287, 0.207628},
                        {0.886302, 0.342586, 0.202968},
                        {0.890341, 0.347957, 0.198286},
                        {0.894305, 0.353399, 0.193584},
                        {0.898192, 0.358911, 0.188860},
                        {0.902003, 0.364492, 0.184116},
                        {0.905735, 0.370140, 0.179350},
                        {0.909390, 0.375856, 0.174563},
                        {0.912966, 0.381636, 0.169755},
                        {0.916462, 0.387481, 0.164924},
                        {0.919879, 0.393389, 0.160070},
                        {0.923215, 0.399359, 0.155193},
                        {0.926470, 0.405389, 0.150292},
                        {0.929644, 0.411479, 0.145367},
                        {0.932737, 0.417627, 0.140417},
                        {0.935747, 0.423831, 0.135440},
                        {0.938675, 0.430091, 0.130438},
                        {0.941521, 0.436405, 0.125409},
                        {0.944285, 0.442772, 0.120354},
                        {0.946965, 0.449191, 0.115272},
                        {0.949562, 0.455660, 0.110164},
                        {0.952075, 0.462178, 0.105031},
                        {0.954506, 0.468744, 0.099874},
                        {0.956852, 0.475356, 0.094695},
                        {0.959114, 0.482014, 0.089499},
                        {0.961293, 0.488716, 0.084289},
                        {0.963387, 0.495462, 0.079073},
                        {0.965397, 0.502249, 0.073859},
                        {0.967322, 0.509078, 0.068659},
                        {0.969163, 0.515946, 0.063488},
                        {0.970919, 0.522853, 0.058367},
                        {0.972590, 0.529798, 0.053324},
                        {0.974176, 0.536780, 0.048392},
                        {0.975677, 0.543798, 0.043618},
                        {0.977092, 0.550850, 0.039050},
                        {0.978422, 0.557937, 0.034931},
                        {0.979666, 0.565057, 0.031409},
                        {0.980824, 0.572209, 0.028508},
                        {0.981895, 0.579392, 0.026250},
                        {0.982881, 0.586606, 0.024661},
                        {0.983779, 0.593849, 0.023770},
                        {0.984591, 0.601122, 0.023606},
                        {0.985315, 0.608422, 0.024202},
                        {0.985952, 0.615750, 0.025592},
                        {0.986502, 0.623105, 0.027814},
                        {0.986964, 0.630485, 0.030908},
                        {0.987337, 0.637890, 0.034916},
                        {0.987622, 0.645320, 0.039886},
                        {0.987819, 0.652773, 0.045581},
                        {0.987926, 0.660250, 0.051750},
                        {0.987945, 0.667748, 0.058329},
                        {0.987874, 0.675267, 0.065257},
                        {0.987714, 0.682807, 0.072489},
                        {0.987464, 0.690366, 0.079990},
                        {0.987124, 0.697944, 0.087731},
                        {0.986694, 0.705540, 0.095694},
                        {0.986175, 0.713153, 0.103863},
                        {0.985566, 0.720782, 0.112229},
                        {0.984865, 0.728427, 0.120785},
                        {0.984075, 0.736087, 0.129527},
                        {0.983196, 0.743758, 0.138453},
                        {0.982228, 0.751442, 0.147565},
                        {0.981173, 0.759135, 0.156863},
                        {0.980032, 0.766837, 0.166353},
                        {0.978806, 0.774545, 0.176037},
                        {0.977497, 0.782258, 0.185923},
                        {0.976108, 0.789974, 0.196018},
                        {0.974638, 0.797692, 0.206332},
                        {0.973088, 0.805409, 0.216877},
                        {0.971468, 0.813122, 0.227658},
                        {0.969783, 0.820825, 0.238686},
                        {0.968041, 0.828515, 0.249972},
                        {0.966243, 0.836191, 0.261534},
                        {0.964394, 0.843848, 0.273391},
                        {0.962517, 0.851476, 0.285546},
                        {0.960626, 0.859069, 0.298010},
                        {0.958720, 0.866624, 0.310820},
                        {0.956834, 0.874129, 0.323974},
                        {0.954997, 0.881569, 0.337475},
                        {0.953215, 0.888942, 0.351369},
                        {0.951546, 0.896226, 0.365627},
                        {0.950018, 0.903409, 0.380271},
                        {0.948683, 0.910473, 0.395289},
                        {0.947594, 0.917399, 0.410665},
                        {0.946809, 0.924168, 0.426373},
                        {0.946392, 0.930761, 0.442367},
                        {0.946403, 0.937159, 0.458592},
                        {0.946903, 0.943348, 0.474970},
                        {0.947937, 0.949318, 0.491426},
                        {0.949545, 0.955063, 0.507860},
                        {0.951740, 0.960587, 0.524203},
                        {0.954529, 0.965896, 0.540361},
                        {0.957896, 0.971003, 0.556275},
                        {0.961812, 0.975924, 0.571925},
                        {0.966249, 0.980678, 0.587206},
                        {0.971162, 0.985282, 0.602154},
                        {0.976511, 0.989753, 0.616760},
                        {0.982257, 0.994109, 0.631017},
                        {0.988362, 0.998364, 0.644924}
                };

        return internal::CalcLerp(x, data);
    }

    inline Color GetPlasmaColor(double x) {
        constexpr Color data[] =
                {
                        {0.050383, 0.029803, 0.527975},
                        {0.063536, 0.028426, 0.533124},
                        {0.075353, 0.027206, 0.538007},
                        {0.086222, 0.026125, 0.542658},
                        {0.096379, 0.025165, 0.547103},
                        {0.105980, 0.024309, 0.551368},
                        {0.115124, 0.023556, 0.555468},
                        {0.123903, 0.022878, 0.559423},
                        {0.132381, 0.022258, 0.563250},
                        {0.140603, 0.021687, 0.566959},
                        {0.148607, 0.021154, 0.570562},
                        {0.156421, 0.020651, 0.574065},
                        {0.164070, 0.020171, 0.577478},
                        {0.171574, 0.019706, 0.580806},
                        {0.178950, 0.019252, 0.584054},
                        {0.186213, 0.018803, 0.587228},
                        {0.193374, 0.018354, 0.590330},
                        {0.200445, 0.017902, 0.593364},
                        {0.207435, 0.017442, 0.596333},
                        {0.214350, 0.016973, 0.599239},
                        {0.221197, 0.016497, 0.602083},
                        {0.227983, 0.016007, 0.604867},
                        {0.234715, 0.015502, 0.607592},
                        {0.241396, 0.014979, 0.610259},
                        {0.248032, 0.014439, 0.612868},
                        {0.254627, 0.013882, 0.615419},
                        {0.261183, 0.013308, 0.617911},
                        {0.267703, 0.012716, 0.620346},
                        {0.274191, 0.012109, 0.622722},
                        {0.280648, 0.011488, 0.625038},
                        {0.287076, 0.010855, 0.627295},
                        {0.293478, 0.010213, 0.629490},
                        {0.299855, 0.009561, 0.631624},
                        {0.306210, 0.008902, 0.633694},
                        {0.312543, 0.008239, 0.635700},
                        {0.318856, 0.007576, 0.637640},
                        {0.325150, 0.006915, 0.639512},
                        {0.331426, 0.006261, 0.641316},
                        {0.337683, 0.005618, 0.643049},
                        {0.343925, 0.004991, 0.644710},
                        {0.350150, 0.004382, 0.646298},
                        {0.356359, 0.003798, 0.647810},
                        {0.362553, 0.003243, 0.649245},
                        {0.368733, 0.002724, 0.650601},
                        {0.374897, 0.002245, 0.651876},
                        {0.381047, 0.001814, 0.653068},
                        {0.387183, 0.001434, 0.654177},
                        {0.393304, 0.001114, 0.655199},
                        {0.399411, 0.000859, 0.656133},
                        {0.405503, 0.000678, 0.656977},
                        {0.411580, 0.000577, 0.657730},
                        {0.417642, 0.000564, 0.658390},
                        {0.423689, 0.000646, 0.658956},
                        {0.429719, 0.000831, 0.659425},
                        {0.435734, 0.001127, 0.659797},
                        {0.441732, 0.001540, 0.660069},
                        {0.447714, 0.002080, 0.660240},
                        {0.453677, 0.002755, 0.660310},
                        {0.459623, 0.003574, 0.660277},
                        {0.465550, 0.004545, 0.660139},
                        {0.471457, 0.005678, 0.659897},
                        {0.477344, 0.006980, 0.659549},
                        {0.483210, 0.008460, 0.659095},
                        {0.489055, 0.010127, 0.658534},
                        {0.494877, 0.011990, 0.657865},
                        {0.500678, 0.014055, 0.657088},
                        {0.506454, 0.016333, 0.656202},
                        {0.512206, 0.018833, 0.655209},
                        {0.517933, 0.021563, 0.654109},
                        {0.523633, 0.024532, 0.652901},
                        {0.529306, 0.027747, 0.651586},
                        {0.534952, 0.031217, 0.650165},
                        {0.540570, 0.034950, 0.648640},
                        {0.546157, 0.038954, 0.647010},
                        {0.551715, 0.043136, 0.645277},
                        {0.557243, 0.047331, 0.643443},
                        {0.562738, 0.051545, 0.641509},
                        {0.568201, 0.055778, 0.639477},
                        {0.573632, 0.060028, 0.637349},
                        {0.579029, 0.064296, 0.635126},
                        {0.584391, 0.068579, 0.632812},
                        {0.589719, 0.072878, 0.630408},
                        {0.595011, 0.077190, 0.627917},
                        {0.600266, 0.081516, 0.625342},
                        {0.605485, 0.085854, 0.622686},
                        {0.610667, 0.090204, 0.619951},
                        {0.615812, 0.094564, 0.617140},
                        {0.620919, 0.098934, 0.614257},
                        {0.625987, 0.103312, 0.611305},
                        {0.631017, 0.107699, 0.608287},
                        {0.636008, 0.112092, 0.605205},
                        {0.640959, 0.116492, 0.602065},
                        {0.645872, 0.120898, 0.598867},
                        {0.650746, 0.125309, 0.595617},
                        {0.655580, 0.129725, 0.592317},
                        {0.660374, 0.134144, 0.588971},
                        {0.665129, 0.138566, 0.585582},
                        {0.669845, 0.142992, 0.582154},
                        {0.674522, 0.147419, 0.578688},
                        {0.679160, 0.151848, 0.575189},
                        {0.683758, 0.156278, 0.571660},
                        {0.688318, 0.160709, 0.568103},
                        {0.692840, 0.165141, 0.564522},
                        {0.697324, 0.169573, 0.560919},
                        {0.701769, 0.174005, 0.557296},
                        {0.706178, 0.178437, 0.553657},
                        {0.710549, 0.182868, 0.550004},
                        {0.714883, 0.187299, 0.546338},
                        {0.719181, 0.191729, 0.542663},
                        {0.723444, 0.196158, 0.538981},
                        {0.727670, 0.200586, 0.535293},
                        {0.731862, 0.205013, 0.531601},
                        {0.736019, 0.209439, 0.527908},
                        {0.740143, 0.213864, 0.524216},
                        {0.744232, 0.218288, 0.520524},
                        {0.748289, 0.222711, 0.516834},
                        {0.752312, 0.227133, 0.513149},
                        {0.756304, 0.231555, 0.509468},
                        {0.760264, 0.235976, 0.505794},
                        {0.764193, 0.240396, 0.502126},
                        {0.768090, 0.244817, 0.498465},
                        {0.771958, 0.249237, 0.494813},
                        {0.775796, 0.253658, 0.491171},
                        {0.779604, 0.258078, 0.487539},
                        {0.783383, 0.262500, 0.483918},
                        {0.787133, 0.266922, 0.480307},
                        {0.790855, 0.271345, 0.476706},
                        {0.794549, 0.275770, 0.473117},
                        {0.798216, 0.280197, 0.469538},
                        {0.801855, 0.284626, 0.465971},
                        {0.805467, 0.289057, 0.462415},
                        {0.809052, 0.293491, 0.458870},
                        {0.812612, 0.297928, 0.455338},
                        {0.816144, 0.302368, 0.451816},
                        {0.819651, 0.306812, 0.448306},
                        {0.823132, 0.311261, 0.444806},
                        {0.826588, 0.315714, 0.441316},
                        {0.830018, 0.320172, 0.437836},
                        {0.833422, 0.324635, 0.434366},
                        {0.836801, 0.329105, 0.430905},
                        {0.840155, 0.333580, 0.427455},
                        {0.843484, 0.338062, 0.424013},
                        {0.846788, 0.342551, 0.420579},
                        {0.850066, 0.347048, 0.417153},
                        {0.853319, 0.351553, 0.413734},
                        {0.856547, 0.356066, 0.410322},
                        {0.859750, 0.360588, 0.406917},
                        {0.862927, 0.365119, 0.403519},
                        {0.866078, 0.369660, 0.400126},
                        {0.869203, 0.374212, 0.396738},
                        {0.872303, 0.378774, 0.393355},
                        {0.875376, 0.383347, 0.389976},
                        {0.878423, 0.387932, 0.386600},
                        {0.881443, 0.392529, 0.383229},
                        {0.884436, 0.397139, 0.379860},
                        {0.887402, 0.401762, 0.376494},
                        {0.890340, 0.406398, 0.373130},
                        {0.893250, 0.411048, 0.369768},
                        {0.896131, 0.415712, 0.366407},
                        {0.898984, 0.420392, 0.363047},
                        {0.901807, 0.425087, 0.359688},
                        {0.904601, 0.429797, 0.356329},
                        {0.907365, 0.434524, 0.352970},
                        {0.910098, 0.439268, 0.349610},
                        {0.912800, 0.444029, 0.346251},
                        {0.915471, 0.448807, 0.342890},
                        {0.918109, 0.453603, 0.339529},
                        {0.920714, 0.458417, 0.336166},
                        {0.923287, 0.463251, 0.332801},
                        {0.925825, 0.468103, 0.329435},
                        {0.928329, 0.472975, 0.326067},
                        {0.930798, 0.477867, 0.322697},
                        {0.933232, 0.482780, 0.319325},
                        {0.935630, 0.487712, 0.315952},
                        {0.937990, 0.492667, 0.312575},
                        {0.940313, 0.497642, 0.309197},
                        {0.942598, 0.502639, 0.305816},
                        {0.944844, 0.507658, 0.302433},
                        {0.947051, 0.512699, 0.299049},
                        {0.949217, 0.517763, 0.295662},
                        {0.951344, 0.522850, 0.292275},
                        {0.953428, 0.527960, 0.288883},
                        {0.955470, 0.533093, 0.285490},
                        {0.957469, 0.538250, 0.282096},
                        {0.959424, 0.543431, 0.278701},
                        {0.961336, 0.548636, 0.275305},
                        {0.963203, 0.553865, 0.271909},
                        {0.965024, 0.559118, 0.268513},
                        {0.966798, 0.564396, 0.265118},
                        {0.968526, 0.569700, 0.261721},
                        {0.970205, 0.575028, 0.258325},
                        {0.971835, 0.580382, 0.254931},
                        {0.973416, 0.585761, 0.251540},
                        {0.974947, 0.591165, 0.248151},
                        {0.976428, 0.596595, 0.244767},
                        {0.977856, 0.602051, 0.241387},
                        {0.979233, 0.607532, 0.238013},
                        {0.980556, 0.613039, 0.234646},
                        {0.981826, 0.618572, 0.231287},
                        {0.983041, 0.624131, 0.227937},
                        {0.984199, 0.629718, 0.224595},
                        {0.985301, 0.635330, 0.221265},
                        {0.986345, 0.640969, 0.217948},
                        {0.987332, 0.646633, 0.214648},
                        {0.988260, 0.652325, 0.211364},
                        {0.989128, 0.658043, 0.208100},
                        {0.989935, 0.663787, 0.204859},
                        {0.990681, 0.669558, 0.201642},
                        {0.991365, 0.675355, 0.198453},
                        {0.991985, 0.681179, 0.195295},
                        {0.992541, 0.687030, 0.192170},
                        {0.993032, 0.692907, 0.189084},
                        {0.993456, 0.698810, 0.186041},
                        {0.993814, 0.704741, 0.183043},
                        {0.994103, 0.710698, 0.180097},
                        {0.994324, 0.716681, 0.177208},
                        {0.994474, 0.722691, 0.174381},
                        {0.994553, 0.728728, 0.171622},
                        {0.994561, 0.734791, 0.168938},
                        {0.994495, 0.740880, 0.166335},
                        {0.994355, 0.746995, 0.163821},
                        {0.994141, 0.753137, 0.161404},
                        {0.993851, 0.759304, 0.159092},
                        {0.993482, 0.765499, 0.156891},
                        {0.993033, 0.771720, 0.154808},
                        {0.992505, 0.777967, 0.152855},
                        {0.991897, 0.784239, 0.151042},
                        {0.991209, 0.790537, 0.149377},
                        {0.990439, 0.796859, 0.147870},
                        {0.989587, 0.803205, 0.146529},
                        {0.988648, 0.809579, 0.145357},
                        {0.987621, 0.815978, 0.144363},
                        {0.986509, 0.822401, 0.143557},
                        {0.985314, 0.828846, 0.142945},
                        {0.984031, 0.835315, 0.142528},
                        {0.982653, 0.841812, 0.142303},
                        {0.981190, 0.848329, 0.142279},
                        {0.979644, 0.854866, 0.142453},
                        {0.977995, 0.861432, 0.142808},
                        {0.976265, 0.868016, 0.143351},
                        {0.974443, 0.874622, 0.144061},
                        {0.972530, 0.881250, 0.144923},
                        {0.970533, 0.887896, 0.145919},
                        {0.968443, 0.894564, 0.147014},
                        {0.966271, 0.901249, 0.148180},
                        {0.964021, 0.907950, 0.149370},
                        {0.961681, 0.914672, 0.150520},
                        {0.959276, 0.921407, 0.151566},
                        {0.956808, 0.928152, 0.152409},
                        {0.954287, 0.934908, 0.152921},
                        {0.951726, 0.941671, 0.152925},
                        {0.949151, 0.948435, 0.152178},
                        {0.946602, 0.955190, 0.150328},
                        {0.944152, 0.961916, 0.146861},
                        {0.941896, 0.968590, 0.140956},
                        {0.940015, 0.975158, 0.131326}
                };

        return internal::CalcLerp(x, data);
    }

    inline Color GetViridisColor(double x) {
        constexpr Color data[] =
                {
                        {0.267004, 0.004874, 0.329415},
                        {0.268510, 0.009605, 0.335427},
                        {0.269944, 0.014625, 0.341379},
                        {0.271305, 0.019942, 0.347269},
                        {0.272594, 0.025563, 0.353093},
                        {0.273809, 0.031497, 0.358853},
                        {0.274952, 0.037752, 0.364543},
                        {0.276022, 0.044167, 0.370164},
                        {0.277018, 0.050344, 0.375715},
                        {0.277941, 0.056324, 0.381191},
                        {0.278791, 0.062145, 0.386592},
                        {0.279566, 0.067836, 0.391917},
                        {0.280267, 0.073417, 0.397163},
                        {0.280894, 0.078907, 0.402329},
                        {0.281446, 0.084320, 0.407414},
                        {0.281924, 0.089666, 0.412415},
                        {0.282327, 0.094955, 0.417331},
                        {0.282656, 0.100196, 0.422160},
                        {0.282910, 0.105393, 0.426902},
                        {0.283091, 0.110553, 0.431554},
                        {0.283197, 0.115680, 0.436115},
                        {0.283229, 0.120777, 0.440584},
                        {0.283187, 0.125848, 0.444960},
                        {0.283072, 0.130895, 0.449241},
                        {0.282884, 0.135920, 0.453427},
                        {0.282623, 0.140926, 0.457517},
                        {0.282290, 0.145912, 0.461510},
                        {0.281887, 0.150881, 0.465405},
                        {0.281412, 0.155834, 0.469201},
                        {0.280868, 0.160771, 0.472899},
                        {0.280255, 0.165693, 0.476498},
                        {0.279574, 0.170599, 0.479997},
                        {0.278826, 0.175490, 0.483397},
                        {0.278012, 0.180367, 0.486697},
                        {0.277134, 0.185228, 0.489898},
                        {0.276194, 0.190074, 0.493001},
                        {0.275191, 0.194905, 0.496005},
                        {0.274128, 0.199721, 0.498911},
                        {0.273006, 0.204520, 0.501721},
                        {0.271828, 0.209303, 0.504434},
                        {0.270595, 0.214069, 0.507052},
                        {0.269308, 0.218818, 0.509577},
                        {0.267968, 0.223549, 0.512008},
                        {0.266580, 0.228262, 0.514349},
                        {0.265145, 0.232956, 0.516599},
                        {0.263663, 0.237631, 0.518762},
                        {0.262138, 0.242286, 0.520837},
                        {0.260571, 0.246922, 0.522828},
                        {0.258965, 0.251537, 0.524736},
                        {0.257322, 0.256130, 0.526563},
                        {0.255645, 0.260703, 0.528312},
                        {0.253935, 0.265254, 0.529983},
                        {0.252194, 0.269783, 0.531579},
                        {0.250425, 0.274290, 0.533103},
                        {0.248629, 0.278775, 0.534556},
                        {0.246811, 0.283237, 0.535941},
                        {0.244972, 0.287675, 0.537260},
                        {0.243113, 0.292092, 0.538516},
                        {0.241237, 0.296485, 0.539709},
                        {0.239346, 0.300855, 0.540844},
                        {0.237441, 0.305202, 0.541921},
                        {0.235526, 0.309527, 0.542944},
                        {0.233603, 0.313828, 0.543914},
                        {0.231674, 0.318106, 0.544834},
                        {0.229739, 0.322361, 0.545706},
                        {0.227802, 0.326594, 0.546532},
                        {0.225863, 0.330805, 0.547314},
                        {0.223925, 0.334994, 0.548053},
                        {0.221989, 0.339161, 0.548752},
                        {0.220057, 0.343307, 0.549413},
                        {0.218130, 0.347432, 0.550038},
                        {0.216210, 0.351535, 0.550627},
                        {0.214298, 0.355619, 0.551184},
                        {0.212395, 0.359683, 0.551710},
                        {0.210503, 0.363727, 0.552206},
                        {0.208623, 0.367752, 0.552675},
                        {0.206756, 0.371758, 0.553117},
                        {0.204903, 0.375746, 0.553533},
                        {0.203063, 0.379716, 0.553925},
                        {0.201239, 0.383670, 0.554294},
                        {0.199430, 0.387607, 0.554642},
                        {0.197636, 0.391528, 0.554969},
                        {0.195860, 0.395433, 0.555276},
                        {0.194100, 0.399323, 0.555565},
                        {0.192357, 0.403199, 0.555836},
                        {0.190631, 0.407061, 0.556089},
                        {0.188923, 0.410910, 0.556326},
                        {0.187231, 0.414746, 0.556547},
                        {0.185556, 0.418570, 0.556753},
                        {0.183898, 0.422383, 0.556944},
                        {0.182256, 0.426184, 0.557120},
                        {0.180629, 0.429975, 0.557282},
                        {0.179019, 0.433756, 0.557430},
                        {0.177423, 0.437527, 0.557565},
                        {0.175841, 0.441290, 0.557685},
                        {0.174274, 0.445044, 0.557792},
                        {0.172719, 0.448791, 0.557885},
                        {0.171176, 0.452530, 0.557965},
                        {0.169646, 0.456262, 0.558030},
                        {0.168126, 0.459988, 0.558082},
                        {0.166617, 0.463708, 0.558119},
                        {0.165117, 0.467423, 0.558141},
                        {0.163625, 0.471133, 0.558148},
                        {0.162142, 0.474838, 0.558140},
                        {0.160665, 0.478540, 0.558115},
                        {0.159194, 0.482237, 0.558073},
                        {0.157729, 0.485932, 0.558013},
                        {0.156270, 0.489624, 0.557936},
                        {0.154815, 0.493313, 0.557840},
                        {0.153364, 0.497000, 0.557724},
                        {0.151918, 0.500685, 0.557587},
                        {0.150476, 0.504369, 0.557430},
                        {0.149039, 0.508051, 0.557250},
                        {0.147607, 0.511733, 0.557049},
                        {0.146180, 0.515413, 0.556823},
                        {0.144759, 0.519093, 0.556572},
                        {0.143343, 0.522773, 0.556295},
                        {0.141935, 0.526453, 0.555991},
                        {0.140536, 0.530132, 0.555659},
                        {0.139147, 0.533812, 0.555298},
                        {0.137770, 0.537492, 0.554906},
                        {0.136408, 0.541173, 0.554483},
                        {0.135066, 0.544853, 0.554029},
                        {0.133743, 0.548535, 0.553541},
                        {0.132444, 0.552216, 0.553018},
                        {0.131172, 0.555899, 0.552459},
                        {0.129933, 0.559582, 0.551864},
                        {0.128729, 0.563265, 0.551229},
                        {0.127568, 0.566949, 0.550556},
                        {0.126453, 0.570633, 0.549841},
                        {0.125394, 0.574318, 0.549086},
                        {0.124395, 0.578002, 0.548287},
                        {0.123463, 0.581687, 0.547445},
                        {0.122606, 0.585371, 0.546557},
                        {0.121831, 0.589055, 0.545623},
                        {0.121148, 0.592739, 0.544641},
                        {0.120565, 0.596422, 0.543611},
                        {0.120092, 0.600104, 0.542530},
                        {0.119738, 0.603785, 0.541400},
                        {0.119512, 0.607464, 0.540218},
                        {0.119423, 0.611141, 0.538982},
                        {0.119483, 0.614817, 0.537692},
                        {0.119699, 0.618490, 0.536347},
                        {0.120081, 0.622161, 0.534946},
                        {0.120638, 0.625828, 0.533488},
                        {0.121380, 0.629492, 0.531973},
                        {0.122312, 0.633153, 0.530398},
                        {0.123444, 0.636809, 0.528763},
                        {0.124780, 0.640461, 0.527068},
                        {0.126326, 0.644107, 0.525311},
                        {0.128087, 0.647749, 0.523491},
                        {0.130067, 0.651384, 0.521608},
                        {0.132268, 0.655014, 0.519661},
                        {0.134692, 0.658636, 0.517649},
                        {0.137339, 0.662252, 0.515571},
                        {0.140210, 0.665859, 0.513427},
                        {0.143303, 0.669459, 0.511215},
                        {0.146616, 0.673050, 0.508936},
                        {0.150148, 0.676631, 0.506589},
                        {0.153894, 0.680203, 0.504172},
                        {0.157851, 0.683765, 0.501686},
                        {0.162016, 0.687316, 0.499129},
                        {0.166383, 0.690856, 0.496502},
                        {0.170948, 0.694384, 0.493803},
                        {0.175707, 0.697900, 0.491033},
                        {0.180653, 0.701402, 0.488189},
                        {0.185783, 0.704891, 0.485273},
                        {0.191090, 0.708366, 0.482284},
                        {0.196571, 0.711827, 0.479221},
                        {0.202219, 0.715272, 0.476084},
                        {0.208030, 0.718701, 0.472873},
                        {0.214000, 0.722114, 0.469588},
                        {0.220124, 0.725509, 0.466226},
                        {0.226397, 0.728888, 0.462789},
                        {0.232815, 0.732247, 0.459277},
                        {0.239374, 0.735588, 0.455688},
                        {0.246070, 0.738910, 0.452024},
                        {0.252899, 0.742211, 0.448284},
                        {0.259857, 0.745492, 0.444467},
                        {0.266941, 0.748751, 0.440573},
                        {0.274149, 0.751988, 0.436601},
                        {0.281477, 0.755203, 0.432552},
                        {0.288921, 0.758394, 0.428426},
                        {0.296479, 0.761561, 0.424223},
                        {0.304148, 0.764704, 0.419943},
                        {0.311925, 0.767822, 0.415586},
                        {0.319809, 0.770914, 0.411152},
                        {0.327796, 0.773980, 0.406640},
                        {0.335885, 0.777018, 0.402049},
                        {0.344074, 0.780029, 0.397381},
                        {0.352360, 0.783011, 0.392636},
                        {0.360741, 0.785964, 0.387814},
                        {0.369214, 0.788888, 0.382914},
                        {0.377779, 0.791781, 0.377939},
                        {0.386433, 0.794644, 0.372886},
                        {0.395174, 0.797475, 0.367757},
                        {0.404001, 0.800275, 0.362552},
                        {0.412913, 0.803041, 0.357269},
                        {0.421908, 0.805774, 0.351910},
                        {0.430983, 0.808473, 0.346476},
                        {0.440137, 0.811138, 0.340967},
                        {0.449368, 0.813768, 0.335384},
                        {0.458674, 0.816363, 0.329727},
                        {0.468053, 0.818921, 0.323998},
                        {0.477504, 0.821444, 0.318195},
                        {0.487026, 0.823929, 0.312321},
                        {0.496615, 0.826376, 0.306377},
                        {0.506271, 0.828786, 0.300362},
                        {0.515992, 0.831158, 0.294279},
                        {0.525776, 0.833491, 0.288127},
                        {0.535621, 0.835785, 0.281908},
                        {0.545524, 0.838039, 0.275626},
                        {0.555484, 0.840254, 0.269281},
                        {0.565498, 0.842430, 0.262877},
                        {0.575563, 0.844566, 0.256415},
                        {0.585678, 0.846661, 0.249897},
                        {0.595839, 0.848717, 0.243329},
                        {0.606045, 0.850733, 0.236712},
                        {0.616293, 0.852709, 0.230052},
                        {0.626579, 0.854645, 0.223353},
                        {0.636902, 0.856542, 0.216620},
                        {0.647257, 0.858400, 0.209861},
                        {0.657642, 0.860219, 0.203082},
                        {0.668054, 0.861999, 0.196293},
                        {0.678489, 0.863742, 0.189503},
                        {0.688944, 0.865448, 0.182725},
                        {0.699415, 0.867117, 0.175971},
                        {0.709898, 0.868751, 0.169257},
                        {0.720391, 0.870350, 0.162603},
                        {0.730889, 0.871916, 0.156029},
                        {0.741388, 0.873449, 0.149561},
                        {0.751884, 0.874951, 0.143228},
                        {0.762373, 0.876424, 0.137064},
                        {0.772852, 0.877868, 0.131109},
                        {0.783315, 0.879285, 0.125405},
                        {0.793760, 0.880678, 0.120005},
                        {0.804182, 0.882046, 0.114965},
                        {0.814576, 0.883393, 0.110347},
                        {0.824940, 0.884720, 0.106217},
                        {0.835270, 0.886029, 0.102646},
                        {0.845561, 0.887322, 0.099702},
                        {0.855810, 0.888601, 0.097452},
                        {0.866013, 0.889868, 0.095953},
                        {0.876168, 0.891125, 0.095250},
                        {0.886271, 0.892374, 0.095374},
                        {0.896320, 0.893616, 0.096335},
                        {0.906311, 0.894855, 0.098125},
                        {0.916242, 0.896091, 0.100717},
                        {0.926106, 0.897330, 0.104071},
                        {0.935904, 0.898570, 0.108131},
                        {0.945636, 0.899815, 0.112838},
                        {0.955300, 0.901065, 0.118128},
                        {0.964894, 0.902323, 0.123941},
                        {0.974417, 0.903590, 0.130215},
                        {0.983868, 0.904867, 0.136897},
                        {0.993248, 0.906157, 0.143936}
                };

        return internal::CalcLerp(x, data);
    }

    inline Color GetCividisColor(double x) {
        constexpr Color data[] =
                {
                        {0.0000, 0.1262, 0.3015},
                        {0.0000, 0.1292, 0.3077},
                        {0.0000, 0.1321, 0.3142},
                        {0.0000, 0.1350, 0.3205},
                        {0.0000, 0.1379, 0.3269},
                        {0.0000, 0.1408, 0.3334},
                        {0.0000, 0.1437, 0.3400},
                        {0.0000, 0.1465, 0.3467},
                        {0.0000, 0.1492, 0.3537},
                        {0.0000, 0.1519, 0.3606},
                        {0.0000, 0.1546, 0.3676},
                        {0.0000, 0.1574, 0.3746},
                        {0.0000, 0.1601, 0.3817},
                        {0.0000, 0.1629, 0.3888},
                        {0.0000, 0.1657, 0.3960},
                        {0.0000, 0.1685, 0.4031},
                        {0.0000, 0.1714, 0.4102},
                        {0.0000, 0.1743, 0.4172},
                        {0.0000, 0.1773, 0.4241},
                        {0.0000, 0.1798, 0.4307},
                        {0.0000, 0.1817, 0.4347},
                        {0.0000, 0.1834, 0.4363},
                        {0.0000, 0.1852, 0.4368},
                        {0.0000, 0.1872, 0.4368},
                        {0.0000, 0.1901, 0.4365},
                        {0.0000, 0.1930, 0.4361},
                        {0.0000, 0.1958, 0.4356},
                        {0.0000, 0.1987, 0.4349},
                        {0.0000, 0.2015, 0.4343},
                        {0.0000, 0.2044, 0.4336},
                        {0.0000, 0.2073, 0.4329},
                        {0.0055, 0.2101, 0.4322},
                        {0.0236, 0.2130, 0.4314},
                        {0.0416, 0.2158, 0.4308},
                        {0.0576, 0.2187, 0.4301},
                        {0.0710, 0.2215, 0.4293},
                        {0.0827, 0.2244, 0.4287},
                        {0.0932, 0.2272, 0.4280},
                        {0.1030, 0.2300, 0.4274},
                        {0.1120, 0.2329, 0.4268},
                        {0.1204, 0.2357, 0.4262},
                        {0.1283, 0.2385, 0.4256},
                        {0.1359, 0.2414, 0.4251},
                        {0.1431, 0.2442, 0.4245},
                        {0.1500, 0.2470, 0.4241},
                        {0.1566, 0.2498, 0.4236},
                        {0.1630, 0.2526, 0.4232},
                        {0.1692, 0.2555, 0.4228},
                        {0.1752, 0.2583, 0.4224},
                        {0.1811, 0.2611, 0.4220},
                        {0.1868, 0.2639, 0.4217},
                        {0.1923, 0.2667, 0.4214},
                        {0.1977, 0.2695, 0.4212},
                        {0.2030, 0.2723, 0.4209},
                        {0.2082, 0.2751, 0.4207},
                        {0.2133, 0.2780, 0.4205},
                        {0.2183, 0.2808, 0.4204},
                        {0.2232, 0.2836, 0.4203},
                        {0.2281, 0.2864, 0.4202},
                        {0.2328, 0.2892, 0.4201},
                        {0.2375, 0.2920, 0.4200},
                        {0.2421, 0.2948, 0.4200},
                        {0.2466, 0.2976, 0.4200},
                        {0.2511, 0.3004, 0.4201},
                        {0.2556, 0.3032, 0.4201},
                        {0.2599, 0.3060, 0.4202},
                        {0.2643, 0.3088, 0.4203},
                        {0.2686, 0.3116, 0.4205},
                        {0.2728, 0.3144, 0.4206},
                        {0.2770, 0.3172, 0.4208},
                        {0.2811, 0.3200, 0.4210},
                        {0.2853, 0.3228, 0.4212},
                        {0.2894, 0.3256, 0.4215},
                        {0.2934, 0.3284, 0.4218},
                        {0.2974, 0.3312, 0.4221},
                        {0.3014, 0.3340, 0.4224},
                        {0.3054, 0.3368, 0.4227},
                        {0.3093, 0.3396, 0.4231},
                        {0.3132, 0.3424, 0.4236},
                        {0.3170, 0.3453, 0.4240},
                        {0.3209, 0.3481, 0.4244},
                        {0.3247, 0.3509, 0.4249},
                        {0.3285, 0.3537, 0.4254},
                        {0.3323, 0.3565, 0.4259},
                        {0.3361, 0.3593, 0.4264},
                        {0.3398, 0.3622, 0.4270},
                        {0.3435, 0.3650, 0.4276},
                        {0.3472, 0.3678, 0.4282},
                        {0.3509, 0.3706, 0.4288},
                        {0.3546, 0.3734, 0.4294},
                        {0.3582, 0.3763, 0.4302},
                        {0.3619, 0.3791, 0.4308},
                        {0.3655, 0.3819, 0.4316},
                        {0.3691, 0.3848, 0.4322},
                        {0.3727, 0.3876, 0.4331},
                        {0.3763, 0.3904, 0.4338},
                        {0.3798, 0.3933, 0.4346},
                        {0.3834, 0.3961, 0.4355},
                        {0.3869, 0.3990, 0.4364},
                        {0.3905, 0.4018, 0.4372},
                        {0.3940, 0.4047, 0.4381},
                        {0.3975, 0.4075, 0.4390},
                        {0.4010, 0.4104, 0.4400},
                        {0.4045, 0.4132, 0.4409},
                        {0.4080, 0.4161, 0.4419},
                        {0.4114, 0.4189, 0.4430},
                        {0.4149, 0.4218, 0.4440},
                        {0.4183, 0.4247, 0.4450},
                        {0.4218, 0.4275, 0.4462},
                        {0.4252, 0.4304, 0.4473},
                        {0.4286, 0.4333, 0.4485},
                        {0.4320, 0.4362, 0.4496},
                        {0.4354, 0.4390, 0.4508},
                        {0.4388, 0.4419, 0.4521},
                        {0.4422, 0.4448, 0.4534},
                        {0.4456, 0.4477, 0.4547},
                        {0.4489, 0.4506, 0.4561},
                        {0.4523, 0.4535, 0.4575},
                        {0.4556, 0.4564, 0.4589},
                        {0.4589, 0.4593, 0.4604},
                        {0.4622, 0.4622, 0.4620},
                        {0.4656, 0.4651, 0.4635},
                        {0.4689, 0.4680, 0.4650},
                        {0.4722, 0.4709, 0.4665},
                        {0.4756, 0.4738, 0.4679},
                        {0.4790, 0.4767, 0.4691},
                        {0.4825, 0.4797, 0.4701},
                        {0.4861, 0.4826, 0.4707},
                        {0.4897, 0.4856, 0.4714},
                        {0.4934, 0.4886, 0.4719},
                        {0.4971, 0.4915, 0.4723},
                        {0.5008, 0.4945, 0.4727},
                        {0.5045, 0.4975, 0.4730},
                        {0.5083, 0.5005, 0.4732},
                        {0.5121, 0.5035, 0.4734},
                        {0.5158, 0.5065, 0.4736},
                        {0.5196, 0.5095, 0.4737},
                        {0.5234, 0.5125, 0.4738},
                        {0.5272, 0.5155, 0.4739},
                        {0.5310, 0.5186, 0.4739},
                        {0.5349, 0.5216, 0.4738},
                        {0.5387, 0.5246, 0.4739},
                        {0.5425, 0.5277, 0.4738},
                        {0.5464, 0.5307, 0.4736},
                        {0.5502, 0.5338, 0.4735},
                        {0.5541, 0.5368, 0.4733},
                        {0.5579, 0.5399, 0.4732},
                        {0.5618, 0.5430, 0.4729},
                        {0.5657, 0.5461, 0.4727},
                        {0.5696, 0.5491, 0.4723},
                        {0.5735, 0.5522, 0.4720},
                        {0.5774, 0.5553, 0.4717},
                        {0.5813, 0.5584, 0.4714},
                        {0.5852, 0.5615, 0.4709},
                        {0.5892, 0.5646, 0.4705},
                        {0.5931, 0.5678, 0.4701},
                        {0.5970, 0.5709, 0.4696},
                        {0.6010, 0.5740, 0.4691},
                        {0.6050, 0.5772, 0.4685},
                        {0.6089, 0.5803, 0.4680},
                        {0.6129, 0.5835, 0.4673},
                        {0.6168, 0.5866, 0.4668},
                        {0.6208, 0.5898, 0.4662},
                        {0.6248, 0.5929, 0.4655},
                        {0.6288, 0.5961, 0.4649},
                        {0.6328, 0.5993, 0.4641},
                        {0.6368, 0.6025, 0.4632},
                        {0.6408, 0.6057, 0.4625},
                        {0.6449, 0.6089, 0.4617},
                        {0.6489, 0.6121, 0.4609},
                        {0.6529, 0.6153, 0.4600},
                        {0.6570, 0.6185, 0.4591},
                        {0.6610, 0.6217, 0.4583},
                        {0.6651, 0.6250, 0.4573},
                        {0.6691, 0.6282, 0.4562},
                        {0.6732, 0.6315, 0.4553},
                        {0.6773, 0.6347, 0.4543},
                        {0.6813, 0.6380, 0.4532},
                        {0.6854, 0.6412, 0.4521},
                        {0.6895, 0.6445, 0.4511},
                        {0.6936, 0.6478, 0.4499},
                        {0.6977, 0.6511, 0.4487},
                        {0.7018, 0.6544, 0.4475},
                        {0.7060, 0.6577, 0.4463},
                        {0.7101, 0.6610, 0.4450},
                        {0.7142, 0.6643, 0.4437},
                        {0.7184, 0.6676, 0.4424},
                        {0.7225, 0.6710, 0.4409},
                        {0.7267, 0.6743, 0.4396},
                        {0.7308, 0.6776, 0.4382},
                        {0.7350, 0.6810, 0.4368},
                        {0.7392, 0.6844, 0.4352},
                        {0.7434, 0.6877, 0.4338},
                        {0.7476, 0.6911, 0.4322},
                        {0.7518, 0.6945, 0.4307},
                        {0.7560, 0.6979, 0.4290},
                        {0.7602, 0.7013, 0.4273},
                        {0.7644, 0.7047, 0.4258},
                        {0.7686, 0.7081, 0.4241},
                        {0.7729, 0.7115, 0.4223},
                        {0.7771, 0.7150, 0.4205},
                        {0.7814, 0.7184, 0.4188},
                        {0.7856, 0.7218, 0.4168},
                        {0.7899, 0.7253, 0.4150},
                        {0.7942, 0.7288, 0.4129},
                        {0.7985, 0.7322, 0.4111},
                        {0.8027, 0.7357, 0.4090},
                        {0.8070, 0.7392, 0.4070},
                        {0.8114, 0.7427, 0.4049},
                        {0.8157, 0.7462, 0.4028},
                        {0.8200, 0.7497, 0.4007},
                        {0.8243, 0.7532, 0.3984},
                        {0.8287, 0.7568, 0.3961},
                        {0.8330, 0.7603, 0.3938},
                        {0.8374, 0.7639, 0.3915},
                        {0.8417, 0.7674, 0.3892},
                        {0.8461, 0.7710, 0.3869},
                        {0.8505, 0.7745, 0.3843},
                        {0.8548, 0.7781, 0.3818},
                        {0.8592, 0.7817, 0.3793},
                        {0.8636, 0.7853, 0.3766},
                        {0.8681, 0.7889, 0.3739},
                        {0.8725, 0.7926, 0.3712},
                        {0.8769, 0.7962, 0.3684},
                        {0.8813, 0.7998, 0.3657},
                        {0.8858, 0.8035, 0.3627},
                        {0.8902, 0.8071, 0.3599},
                        {0.8947, 0.8108, 0.3569},
                        {0.8992, 0.8145, 0.3538},
                        {0.9037, 0.8182, 0.3507},
                        {0.9082, 0.8219, 0.3474},
                        {0.9127, 0.8256, 0.3442},
                        {0.9172, 0.8293, 0.3409},
                        {0.9217, 0.8330, 0.3374},
                        {0.9262, 0.8367, 0.3340},
                        {0.9308, 0.8405, 0.3306},
                        {0.9353, 0.8442, 0.3268},
                        {0.9399, 0.8480, 0.3232},
                        {0.9444, 0.8518, 0.3195},
                        {0.9490, 0.8556, 0.3155},
                        {0.9536, 0.8593, 0.3116},
                        {0.9582, 0.8632, 0.3076},
                        {0.9628, 0.8670, 0.3034},
                        {0.9674, 0.8708, 0.2990},
                        {0.9721, 0.8746, 0.2947},
                        {0.9767, 0.8785, 0.2901},
                        {0.9814, 0.8823, 0.2856},
                        {0.9860, 0.8862, 0.2807},
                        {0.9907, 0.8901, 0.2759},
                        {0.9954, 0.8940, 0.2708},
                        {1.0000, 0.8979, 0.2655},
                        {1.0000, 0.9018, 0.2600},
                        {1.0000, 0.9057, 0.2593},
                        {1.0000, 0.9094, 0.2634},
                        {1.0000, 0.9131, 0.2680},
                        {1.0000, 0.9169, 0.2731}
                };

        return internal::CalcLerp(x, data);
    }

    inline Color GetGithubColor(double x) {
        constexpr Color data[] =
                {
                        {0.933333, 0.933333, 0.933333},
                        {0.776470, 0.894117, 0.545098},
                        {0.482352, 0.788235, 0.435294},
                        {0.137254, 0.603921, 0.231372},
                        {0.098039, 0.380392, 0.152941}
                };

        return internal::CalcLerp(x, data);
    }

    inline Color GetHsvColor(double x) {
        constexpr Color data[] =
                {
                        {0.8060, 1.0000, 0.0000},
                        {0.8000, 1.0000, 0.0000},
                        {0.7940, 1.0000, 0.0000},
                        {0.7880, 1.0000, 0.0000},
                        {0.7820, 1.0000, 0.0000},
                        {0.7760, 1.0000, 0.0000},
                        {0.7700, 1.0000, 0.0000},
                        {0.7640, 1.0000, 0.0000},
                        {0.7580, 1.0000, 0.0000},
                        {0.7520, 1.0000, 0.0000},
                        {0.7460, 1.0000, 0.0000},
                        {0.7400, 1.0000, 0.0000},
                        {0.7340, 1.0000, 0.0000},
                        {0.7280, 1.0000, 0.0000},
                        {0.7220, 1.0000, 0.0000},
                        {0.7160, 1.0000, 0.0000},
                        {0.7100, 1.0000, 0.0000},
                        {0.7040, 1.0000, 0.0000},
                        {0.6980, 1.0000, 0.0000},
                        {0.6920, 1.0000, 0.0000},
                        {0.6860, 1.0000, 0.0000},
                        {0.6800, 1.0000, 0.0000},
                        {0.6740, 1.0000, 0.0000},
                        {0.6680, 1.0000, 0.0000},
                        {0.6620, 1.0000, 0.0000},
                        {0.6560, 1.0000, 0.0000},
                        {0.6500, 1.0000, 0.0000},
                        {0.6440, 1.0000, 0.0000},
                        {0.6380, 1.0000, 0.0000},
                        {0.6320, 1.0000, 0.0000},
                        {0.6260, 1.0000, 0.0000},
                        {0.6200, 1.0000, 0.0000},
                        {0.6140, 1.0000, 0.0000},
                        {0.6080, 1.0000, 0.0000},
                        {0.6020, 1.0000, 0.0000},
                        {0.5960, 1.0000, 0.0000},
                        {0.5900, 1.0000, 0.0000},
                        {0.5840, 1.0000, 0.0000},
                        {0.5780, 1.0000, 0.0000},
                        {0.5720, 1.0000, 0.0000},
                        {0.5660, 1.0000, 0.0000},
                        {0.5600, 1.0000, 0.0000},
                        {0.5540, 1.0000, 0.0000},
                        {0.5480, 1.0000, 0.0000},
                        {0.5420, 1.0000, 0.0000},
                        {0.5360, 1.0000, 0.0000},
                        {0.5300, 1.0000, 0.0000},
                        {0.5240, 1.0000, 0.0000},
                        {0.5180, 1.0000, 0.0000},
                        {0.5120, 1.0000, 0.0000},
                        {0.5060, 1.0000, 0.0000},
                        {0.5000, 1.0000, 0.0000},
                        {0.4940, 1.0000, 0.0000},
                        {0.4880, 1.0000, 0.0000},
                        {0.4820, 1.0000, 0.0000},
                        {0.4760, 1.0000, 0.0000},
                        {0.4700, 1.0000, 0.0000},
                        {0.4640, 1.0000, 0.0000},
                        {0.4580, 1.0000, 0.0000},
                        {0.4520, 1.0000, 0.0000},
                        {0.4460, 1.0000, 0.0000},
                        {0.4400, 1.0000, 0.0000},
                        {0.4340, 1.0000, 0.0000},
                        {0.4280, 1.0000, 0.0000},
                        {0.4220, 1.0000, 0.0000},
                        {0.4160, 1.0000, 0.0000},
                        {0.4100, 1.0000, 0.0000},
                        {0.4040, 1.0000, 0.0000},
                        {0.3980, 1.0000, 0.0000},
                        {0.3920, 1.0000, 0.0000},
                        {0.3860, 1.0000, 0.0000},
                        {0.3800, 1.0000, 0.0000},
                        {0.3740, 1.0000, 0.0000},
                        {0.3680, 1.0000, 0.0000},
                        {0.3620, 1.0000, 0.0000},
                        {0.3560, 1.0000, 0.0000},
                        {0.3500, 1.0000, 0.0000},
                        {0.3440, 1.0000, 0.0000},
                        {0.3380, 1.0000, 0.0000},
                        {0.3320, 1.0000, 0.0000},
                        {0.3260, 1.0000, 0.0000},
                        {0.3200, 1.0000, 0.0000},
                        {0.3140, 1.0000, 0.0000},
                        {0.3080, 1.0000, 0.0000},
                        {0.3020, 1.0000, 0.0000},
                        {0.2960, 1.0000, 0.0000},
                        {0.2900, 1.0000, 0.0000},
                        {0.2840, 1.0000, 0.0000},
                        {0.2780, 1.0000, 0.0000},
                        {0.2720, 1.0000, 0.0000},
                        {0.2660, 1.0000, 0.0000},
                        {0.2600, 1.0000, 0.0000},
                        {0.2540, 1.0000, 0.0000},
                        {0.2480, 1.0000, 0.0000},
                        {0.2420, 1.0000, 0.0000},
                        {0.2360, 1.0000, 0.0000},
                        {0.2300, 1.0000, 0.0000},
                        {0.2240, 1.0000, 0.0000},
                        {0.2180, 1.0000, 0.0000},
                        {0.2120, 1.0000, 0.0000},
                        {0.2060, 1.0000, 0.0000},
                        {0.2000, 1.0000, 0.0000},
                        {0.1940, 1.0000, 0.0000},
                        {0.1880, 1.0000, 0.0000},
                        {0.1820, 1.0000, 0.0000},
                        {0.1760, 1.0000, 0.0000},
                        {0.1700, 1.0000, 0.0000},
                        {0.1640, 1.0000, 0.0000},
                        {0.1580, 1.0000, 0.0000},
                        {0.1520, 1.0000, 0.0000},
                        {0.1460, 1.0000, 0.0000},
                        {0.1400, 1.0000, 0.0000},
                        {0.1340, 1.0000, 0.0000},
                        {0.1280, 1.0000, 0.0000},
                        {0.1220, 1.0000, 0.0000},
                        {0.1160, 1.0000, 0.0000},
                        {0.1100, 1.0000, 0.0000},
                        {0.1040, 1.0000, 0.0000},
                        {0.0980, 1.0000, 0.0000},
                        {0.0920, 1.0000, 0.0000},
                        {0.0860, 1.0000, 0.0000},
                        {0.0800, 1.0000, 0.0000},
                        {0.0740, 1.0000, 0.0000},
                        {0.0680, 1.0000, 0.0000},
                        {0.0620, 1.0000, 0.0000},
                        {0.0560, 1.0000, 0.0000},
                        {0.0500, 1.0000, 0.0000},
                        {0.0440, 1.0000, 0.0000},
                        {0.0380, 1.0000, 0.0000},
                        {0.0320, 1.0000, 0.0000},
                        {0.0260, 1.0000, 0.0000},
                        {0.0200, 1.0000, 0.0000},
                        {0.0140, 1.0000, 0.0000},
                        {0.0080, 1.0000, 0.0000},
                        {0.0020, 1.0000, 0.0000},
                        {0.0000, 1.0000, 0.0040},
                        {0.0000, 1.0000, 0.0100},
                        {0.0000, 1.0000, 0.0160},
                        {0.0000, 1.0000, 0.0220},
                        {0.0000, 1.0000, 0.0280},
                        {0.0000, 1.0000, 0.0340},
                        {0.0000, 1.0000, 0.0400},
                        {0.0000, 1.0000, 0.0460},
                        {0.0000, 1.0000, 0.0520},
                        {0.0000, 1.0000, 0.0580},
                        {0.0000, 1.0000, 0.0640},
                        {0.0000, 1.0000, 0.0700},
                        {0.0000, 1.0000, 0.0760},
                        {0.0000, 1.0000, 0.0820},
                        {0.0000, 1.0000, 0.0880},
                        {0.0000, 1.0000, 0.0940},
                        {0.0000, 1.0000, 0.1000},
                        {0.0000, 1.0000, 0.1060},
                        {0.0000, 1.0000, 0.1120},
                        {0.0000, 1.0000, 0.1180},
                        {0.0000, 1.0000, 0.1240},
                        {0.0000, 1.0000, 0.1300},
                        {0.0000, 1.0000, 0.1360},
                        {0.0000, 1.0000, 0.1420},
                        {0.0000, 1.0000, 0.1480},
                        {0.0000, 1.0000, 0.1540},
                        {0.0000, 1.0000, 0.1600},
                        {0.0000, 1.0000, 0.1660},
                        {0.0000, 1.0000, 0.1720},
                        {0.0000, 1.0000, 0.1780},
                        {0.0000, 1.0000, 0.1840},
                        {0.0000, 1.0000, 0.1900},
                        {0.0000, 1.0000, 0.1960},
                        {0.0000, 1.0000, 0.2020},
                        {0.0000, 1.0000, 0.2080},
                        {0.0000, 1.0000, 0.2140},
                        {0.0000, 1.0000, 0.2200},
                        {0.0000, 1.0000, 0.2260},
                        {0.0000, 1.0000, 0.2320},
                        {0.0000, 1.0000, 0.2380},
                        {0.0000, 1.0000, 0.2440},
                        {0.0000, 1.0000, 0.2500},
                        {0.0000, 1.0000, 0.2560},
                        {0.0000, 1.0000, 0.2620},
                        {0.0000, 1.0000, 0.2680},
                        {0.0000, 1.0000, 0.2740},
                        {0.0000, 1.0000, 0.2800},
                        {0.0000, 1.0000, 0.2860},
                        {0.0000, 1.0000, 0.2920},
                        {0.0000, 1.0000, 0.2980},
                        {0.0000, 1.0000, 0.3040},
                        {0.0000, 1.0000, 0.3100},
                        {0.0000, 1.0000, 0.3160},
                        {0.0000, 1.0000, 0.3220},
                        {0.0000, 1.0000, 0.3280},
                        {0.0000, 1.0000, 0.3340},
                        {0.0000, 1.0000, 0.3400},
                        {0.0000, 1.0000, 0.3460},
                        {0.0000, 1.0000, 0.3520},
                        {0.0000, 1.0000, 0.3580},
                        {0.0000, 1.0000, 0.3640},
                        {0.0000, 1.0000, 0.3700},
                        {0.0000, 1.0000, 0.3760},
                        {0.0000, 1.0000, 0.3820},
                        {0.0000, 1.0000, 0.3880},
                        {0.0000, 1.0000, 0.3940},
                        {0.0000, 1.0000, 0.4000},
                        {0.0000, 1.0000, 0.4060},
                        {0.0000, 1.0000, 0.4120},
                        {0.0000, 1.0000, 0.4180},
                        {0.0000, 1.0000, 0.4240},
                        {0.0000, 1.0000, 0.4300},
                        {0.0000, 1.0000, 0.4360},
                        {0.0000, 1.0000, 0.4420},
                        {0.0000, 1.0000, 0.4480},
                        {0.0000, 1.0000, 0.4540},
                        {0.0000, 1.0000, 0.4600},
                        {0.0000, 1.0000, 0.4660},
                        {0.0000, 1.0000, 0.4720},
                        {0.0000, 1.0000, 0.4780},
                        {0.0000, 1.0000, 0.4840},
                        {0.0000, 1.0000, 0.4900},
                        {0.0000, 1.0000, 0.4960},
                        {0.0000, 1.0000, 0.5020},
                        {0.0000, 1.0000, 0.5080},
                        {0.0000, 1.0000, 0.5140},
                        {0.0000, 1.0000, 0.5200},
                        {0.0000, 1.0000, 0.5260},
                        {0.0000, 1.0000, 0.5320},
                        {0.0000, 1.0000, 0.5380},
                        {0.0000, 1.0000, 0.5440},
                        {0.0000, 1.0000, 0.5500},
                        {0.0000, 1.0000, 0.5560},
                        {0.0000, 1.0000, 0.5620},
                        {0.0000, 1.0000, 0.5680},
                        {0.0000, 1.0000, 0.5740},
                        {0.0000, 1.0000, 0.5800},
                        {0.0000, 1.0000, 0.5860},
                        {0.0000, 1.0000, 0.5920},
                        {0.0000, 1.0000, 0.5980},
                        {0.0000, 1.0000, 0.6040},
                        {0.0000, 1.0000, 0.6100},
                        {0.0000, 1.0000, 0.6160},
                        {0.0000, 1.0000, 0.6220},
                        {0.0000, 1.0000, 0.6280},
                        {0.0000, 1.0000, 0.6340},
                        {0.0000, 1.0000, 0.6400},
                        {0.0000, 1.0000, 0.6460},
                        {0.0000, 1.0000, 0.6520},
                        {0.0000, 1.0000, 0.6580},
                        {0.0000, 1.0000, 0.6640},
                        {0.0000, 1.0000, 0.6700},
                        {0.0000, 1.0000, 0.6760},
                        {0.0000, 1.0000, 0.6820},
                        {0.0000, 1.0000, 0.6880},
                        {0.0000, 1.0000, 0.6940},
                        {0.0000, 1.0000, 0.7000},
                        {0.0000, 1.0000, 0.7060},
                        {0.0000, 1.0000, 0.7120},
                        {0.0000, 1.0000, 0.7180},
                        {0.0000, 1.0000, 0.7240},
                        {0.0000, 1.0000, 0.7300},
                        {0.0000, 1.0000, 0.7360},
                        {0.0000, 1.0000, 0.7420},
                        {0.0000, 1.0000, 0.7480},
                        {0.0000, 1.0000, 0.7540},
                        {0.0000, 1.0000, 0.7600},
                        {0.0000, 1.0000, 0.7660},
                        {0.0000, 1.0000, 0.7720},
                        {0.0000, 1.0000, 0.7780},
                        {0.0000, 1.0000, 0.7840},
                        {0.0000, 1.0000, 0.7900},
                        {0.0000, 1.0000, 0.7960},
                        {0.0000, 1.0000, 0.8020},
                        {0.0000, 1.0000, 0.8080},
                        {0.0000, 1.0000, 0.8140},
                        {0.0000, 1.0000, 0.8200},
                        {0.0000, 1.0000, 0.8260},
                        {0.0000, 1.0000, 0.8320},
                        {0.0000, 1.0000, 0.8380},
                        {0.0000, 1.0000, 0.8440},
                        {0.0000, 1.0000, 0.8500},
                        {0.0000, 1.0000, 0.8560},
                        {0.0000, 1.0000, 0.8620},
                        {0.0000, 1.0000, 0.8680},
                        {0.0000, 1.0000, 0.8740},
                        {0.0000, 1.0000, 0.8800},
                        {0.0000, 1.0000, 0.8860},
                        {0.0000, 1.0000, 0.8920},
                        {0.0000, 1.0000, 0.8980},
                        {0.0000, 1.0000, 0.9040},
                        {0.0000, 1.0000, 0.9100},
                        {0.0000, 1.0000, 0.9160},
                        {0.0000, 1.0000, 0.9220},
                        {0.0000, 1.0000, 0.9280},
                        {0.0000, 1.0000, 0.9340},
                        {0.0000, 1.0000, 0.9400},
                        {0.0000, 1.0000, 0.9460},
                        {0.0000, 1.0000, 0.9520},
                        {0.0000, 1.0000, 0.9580},
                        {0.0000, 1.0000, 0.9640},
                        {0.0000, 1.0000, 0.9700},
                        {0.0000, 1.0000, 0.9760},
                        {0.0000, 1.0000, 0.9820},
                        {0.0000, 1.0000, 0.9880},
                        {0.0000, 1.0000, 0.9940},
                        {0.0000, 1.0000, 1.0000},
                        {0.0000, 0.9940, 1.0000},
                        {0.0000, 0.9880, 1.0000},
                        {0.0000, 0.9820, 1.0000},
                        {0.0000, 0.9760, 1.0000},
                        {0.0000, 0.9700, 1.0000},
                        {0.0000, 0.9640, 1.0000},
                        {0.0000, 0.9580, 1.0000},
                        {0.0000, 0.9520, 1.0000},
                        {0.0000, 0.9460, 1.0000},
                        {0.0000, 0.9400, 1.0000},
                        {0.0000, 0.9340, 1.0000},
                        {0.0000, 0.9280, 1.0000},
                        {0.0000, 0.9220, 1.0000},
                        {0.0000, 0.9160, 1.0000},
                        {0.0000, 0.9100, 1.0000},
                        {0.0000, 0.9040, 1.0000},
                        {0.0000, 0.8980, 1.0000},
                        {0.0000, 0.8920, 1.0000},
                        {0.0000, 0.8860, 1.0000},
                        {0.0000, 0.8800, 1.0000},
                        {0.0000, 0.8740, 1.0000},
                        {0.0000, 0.8680, 1.0000},
                        {0.0000, 0.8620, 1.0000},
                        {0.0000, 0.8560, 1.0000},
                        {0.0000, 0.8500, 1.0000},
                        {0.0000, 0.8440, 1.0000},
                        {0.0000, 0.8380, 1.0000},
                        {0.0000, 0.8320, 1.0000},
                        {0.0000, 0.8260, 1.0000},
                        {0.0000, 0.8200, 1.0000},
                        {0.0000, 0.8140, 1.0000},
                        {0.0000, 0.8080, 1.0000},
                        {0.0000, 0.8020, 1.0000},
                        {0.0000, 0.7960, 1.0000},
                        {0.0000, 0.7900, 1.0000},
                        {0.0000, 0.7840, 1.0000},
                        {0.0000, 0.7780, 1.0000},
                        {0.0000, 0.7720, 1.0000},
                        {0.0000, 0.7660, 1.0000},
                        {0.0000, 0.7600, 1.0000},
                        {0.0000, 0.7540, 1.0000},
                        {0.0000, 0.7480, 1.0000},
                        {0.0000, 0.7420, 1.0000},
                        {0.0000, 0.7360, 1.0000},
                        {0.0000, 0.7300, 1.0000},
                        {0.0000, 0.7240, 1.0000},
                        {0.0000, 0.7180, 1.0000},
                        {0.0000, 0.7120, 1.0000},
                        {0.0000, 0.7060, 1.0000},
                        {0.0000, 0.7000, 1.0000},
                        {0.0000, 0.6940, 1.0000},
                        {0.0000, 0.6880, 1.0000},
                        {0.0000, 0.6820, 1.0000},
                        {0.0000, 0.6760, 1.0000},
                        {0.0000, 0.6700, 1.0000},
                        {0.0000, 0.6640, 1.0000},
                        {0.0000, 0.6580, 1.0000},
                        {0.0000, 0.6520, 1.0000},
                        {0.0000, 0.6460, 1.0000},
                        {0.0000, 0.6400, 1.0000},
                        {0.0000, 0.6340, 1.0000},
                        {0.0000, 0.6280, 1.0000},
                        {0.0000, 0.6220, 1.0000},
                        {0.0000, 0.6160, 1.0000},
                        {0.0000, 0.6100, 1.0000},
                        {0.0000, 0.6040, 1.0000},
                        {0.0000, 0.5980, 1.0000},
                        {0.0000, 0.5920, 1.0000},
                        {0.0000, 0.5860, 1.0000},
                        {0.0000, 0.5800, 1.0000},
                        {0.0000, 0.5740, 1.0000},
                        {0.0000, 0.5680, 1.0000},
                        {0.0000, 0.5620, 1.0000},
                        {0.0000, 0.5560, 1.0000},
                        {0.0000, 0.5500, 1.0000},
                        {0.0000, 0.5440, 1.0000},
                        {0.0000, 0.5380, 1.0000},
                        {0.0000, 0.5320, 1.0000},
                        {0.0000, 0.5260, 1.0000},
                        {0.0000, 0.5200, 1.0000},
                        {0.0000, 0.5140, 1.0000},
                        {0.0000, 0.5080, 1.0000},
                        {0.0000, 0.5020, 1.0000},
                        {0.0000, 0.4960, 1.0000},
                        {0.0000, 0.4900, 1.0000},
                        {0.0000, 0.4840, 1.0000},
                        {0.0000, 0.4780, 1.0000},
                        {0.0000, 0.4720, 1.0000},
                        {0.0000, 0.4660, 1.0000},
                        {0.0000, 0.4600, 1.0000},
                        {0.0000, 0.4540, 1.0000},
                        {0.0000, 0.4480, 1.0000},
                        {0.0000, 0.4420, 1.0000},
                        {0.0000, 0.4360, 1.0000},
                        {0.0000, 0.4300, 1.0000},
                        {0.0000, 0.4240, 1.0000},
                        {0.0000, 0.4180, 1.0000},
                        {0.0000, 0.4120, 1.0000},
                        {0.0000, 0.4060, 1.0000},
                        {0.0000, 0.4000, 1.0000},
                        {0.0000, 0.3940, 1.0000},
                        {0.0000, 0.3880, 1.0000},
                        {0.0000, 0.3820, 1.0000},
                        {0.0000, 0.3760, 1.0000},
                        {0.0000, 0.3700, 1.0000},
                        {0.0000, 0.3640, 1.0000},
                        {0.0000, 0.3580, 1.0000},
                        {0.0000, 0.3520, 1.0000},
                        {0.0000, 0.3460, 1.0000},
                        {0.0000, 0.3400, 1.0000},
                        {0.0000, 0.3340, 1.0000},
                        {0.0000, 0.3280, 1.0000},
                        {0.0000, 0.3220, 1.0000},
                        {0.0000, 0.3160, 1.0000},
                        {0.0000, 0.3100, 1.0000},
                        {0.0000, 0.3040, 1.0000},
                        {0.0000, 0.2980, 1.0000},
                        {0.0000, 0.2920, 1.0000},
                        {0.0000, 0.2860, 1.0000},
                        {0.0000, 0.2800, 1.0000},
                        {0.0000, 0.2740, 1.0000},
                        {0.0000, 0.2680, 1.0000},
                        {0.0000, 0.2620, 1.0000},
                        {0.0000, 0.2560, 1.0000},
                        {0.0000, 0.2500, 1.0000},
                        {0.0000, 0.2440, 1.0000},
                        {0.0000, 0.2380, 1.0000},
                        {0.0000, 0.2320, 1.0000},
                        {0.0000, 0.2260, 1.0000},
                        {0.0000, 0.2200, 1.0000},
                        {0.0000, 0.2140, 1.0000},
                        {0.0000, 0.2080, 1.0000},
                        {0.0000, 0.2020, 1.0000},
                        {0.0000, 0.1960, 1.0000},
                        {0.0000, 0.1900, 1.0000},
                        {0.0000, 0.1840, 1.0000},
                        {0.0000, 0.1780, 1.0000},
                        {0.0000, 0.1720, 1.0000},
                        {0.0000, 0.1660, 1.0000},
                        {0.0000, 0.1600, 1.0000},
                        {0.0000, 0.1540, 1.0000},
                        {0.0000, 0.1480, 1.0000},
                        {0.0000, 0.1420, 1.0000},
                        {0.0000, 0.1360, 1.0000},
                        {0.0000, 0.1300, 1.0000},
                        {0.0000, 0.1240, 1.0000},
                        {0.0000, 0.1180, 1.0000},
                        {0.0000, 0.1120, 1.0000},
                        {0.0000, 0.1060, 1.0000},
                        {0.0000, 0.1000, 1.0000},
                        {0.0000, 0.0940, 1.0000},
                        {0.0000, 0.0880, 1.0000},
                        {0.0000, 0.0820, 1.0000},
                        {0.0000, 0.0760, 1.0000},
                        {0.0000, 0.0700, 1.0000},
                        {0.0000, 0.0640, 1.0000},
                        {0.0000, 0.0580, 1.0000},
                        {0.0000, 0.0520, 1.0000},
                        {0.0000, 0.0460, 1.0000},
                        {0.0000, 0.0400, 1.0000},
                        {0.0000, 0.0340, 1.0000},
                        {0.0000, 0.0280, 1.0000},
                        {0.0000, 0.0220, 1.0000},
                        {0.0000, 0.0160, 1.0000},
                        {0.0000, 0.0100, 1.0000},
                        {0.0000, 0.0040, 1.0000},
                        {0.0020, 0.0000, 1.0000},
                        {0.0080, 0.0000, 1.0000},
                        {0.0140, 0.0000, 1.0000},
                        {0.0200, 0.0000, 1.0000},
                        {0.0260, 0.0000, 1.0000},
                        {0.0320, 0.0000, 1.0000},
                        {0.0380, 0.0000, 1.0000},
                        {0.0440, 0.0000, 1.0000},
                        {0.0500, 0.0000, 1.0000},
                        {0.0560, 0.0000, 1.0000},
                        {0.0620, 0.0000, 1.0000},
                        {0.0680, 0.0000, 1.0000},
                        {0.0740, 0.0000, 1.0000},
                        {0.0800, 0.0000, 1.0000},
                        {0.0860, 0.0000, 1.0000},
                        {0.0920, 0.0000, 1.0000},
                        {0.0980, 0.0000, 1.0000},
                        {0.1040, 0.0000, 1.0000},
                        {0.1100, 0.0000, 1.0000},
                        {0.1160, 0.0000, 1.0000},
                        {0.1220, 0.0000, 1.0000},
                        {0.1280, 0.0000, 1.0000},
                        {0.1340, 0.0000, 1.0000},
                        {0.1400, 0.0000, 1.0000},
                        {0.1460, 0.0000, 1.0000},
                        {0.1520, 0.0000, 1.0000},
                        {0.1580, 0.0000, 1.0000},
                        {0.1640, 0.0000, 1.0000},
                        {0.1700, 0.0000, 1.0000},
                        {0.1760, 0.0000, 1.0000},
                        {0.1820, 0.0000, 1.0000},
                        {0.1880, 0.0000, 1.0000},
                        {0.1940, 0.0000, 1.0000},
                        {0.2000, 0.0000, 1.0000},
                        {0.2060, 0.0000, 1.0000},
                        {0.2120, 0.0000, 1.0000},
                        {0.2180, 0.0000, 1.0000},
                        {0.2240, 0.0000, 1.0000},
                        {0.2300, 0.0000, 1.0000},
                        {0.2360, 0.0000, 1.0000},
                        {0.2420, 0.0000, 1.0000},
                        {0.2480, 0.0000, 1.0000},
                        {0.2540, 0.0000, 1.0000},
                        {0.2600, 0.0000, 1.0000},
                        {0.2660, 0.0000, 1.0000},
                        {0.2720, 0.0000, 1.0000},
                        {0.2780, 0.0000, 1.0000},
                        {0.2840, 0.0000, 1.0000},
                        {0.2900, 0.0000, 1.0000},
                        {0.2960, 0.0000, 1.0000},
                        {0.3020, 0.0000, 1.0000},
                        {0.3080, 0.0000, 1.0000},
                        {0.3140, 0.0000, 1.0000},
                        {0.3200, 0.0000, 1.0000},
                        {0.3260, 0.0000, 1.0000},
                        {0.3320, 0.0000, 1.0000},
                        {0.3380, 0.0000, 1.0000},
                        {0.3440, 0.0000, 1.0000},
                        {0.3500, 0.0000, 1.0000},
                        {0.3560, 0.0000, 1.0000},
                        {0.3620, 0.0000, 1.0000},
                        {0.3680, 0.0000, 1.0000},
                        {0.3740, 0.0000, 1.0000},
                        {0.3800, 0.0000, 1.0000},
                        {0.3860, 0.0000, 1.0000},
                        {0.3920, 0.0000, 1.0000},
                        {0.3980, 0.0000, 1.0000},
                        {0.4040, 0.0000, 1.0000},
                        {0.4100, 0.0000, 1.0000},
                        {0.4160, 0.0000, 1.0000},
                        {0.4220, 0.0000, 1.0000},
                        {0.4280, 0.0000, 1.0000},
                        {0.4340, 0.0000, 1.0000},
                        {0.4400, 0.0000, 1.0000},
                        {0.4460, 0.0000, 1.0000},
                        {0.4520, 0.0000, 1.0000},
                        {0.4580, 0.0000, 1.0000},
                        {0.4640, 0.0000, 1.0000},
                        {0.4700, 0.0000, 1.0000},
                        {0.4760, 0.0000, 1.0000},
                        {0.4820, 0.0000, 1.0000},
                        {0.4880, 0.0000, 1.0000},
                        {0.4940, 0.0000, 1.0000},
                        {0.5000, 0.0000, 1.0000},
                        {0.5060, 0.0000, 1.0000},
                        {0.5120, 0.0000, 1.0000},
                        {0.5180, 0.0000, 1.0000},
                        {0.5240, 0.0000, 1.0000},
                        {0.5300, 0.0000, 1.0000},
                        {0.5360, 0.0000, 1.0000},
                        {0.5420, 0.0000, 1.0000},
                        {0.5480, 0.0000, 1.0000},
                        {0.5540, 0.0000, 1.0000},
                        {0.5600, 0.0000, 1.0000},
                        {0.5660, 0.0000, 1.0000},
                        {0.5720, 0.0000, 1.0000},
                        {0.5780, 0.0000, 1.0000},
                        {0.5840, 0.0000, 1.0000},
                        {0.5900, 0.0000, 1.0000},
                        {0.5960, 0.0000, 1.0000},
                        {0.6020, 0.0000, 1.0000},
                        {0.6080, 0.0000, 1.0000},
                        {0.6140, 0.0000, 1.0000},
                        {0.6200, 0.0000, 1.0000},
                        {0.6260, 0.0000, 1.0000},
                        {0.6320, 0.0000, 1.0000},
                        {0.6380, 0.0000, 1.0000},
                        {0.6440, 0.0000, 1.0000},
                        {0.6500, 0.0000, 1.0000},
                        {0.6560, 0.0000, 1.0000},
                        {0.6620, 0.0000, 1.0000},
                        {0.6680, 0.0000, 1.0000},
                        {0.6740, 0.0000, 1.0000},
                        {0.6800, 0.0000, 1.0000},
                        {0.6860, 0.0000, 1.0000},
                        {0.6920, 0.0000, 1.0000},
                        {0.6980, 0.0000, 1.0000},
                        {0.7040, 0.0000, 1.0000},
                        {0.7100, 0.0000, 1.0000},
                        {0.7160, 0.0000, 1.0000},
                        {0.7220, 0.0000, 1.0000},
                        {0.7280, 0.0000, 1.0000},
                        {0.7340, 0.0000, 1.0000},
                        {0.7400, 0.0000, 1.0000},
                        {0.7460, 0.0000, 1.0000},
                        {0.7520, 0.0000, 1.0000},
                        {0.7580, 0.0000, 1.0000},
                        {0.7640, 0.0000, 1.0000},
                        {0.7700, 0.0000, 1.0000},
                        {0.7760, 0.0000, 1.0000},
                        {0.7820, 0.0000, 1.0000},
                        {0.7880, 0.0000, 1.0000},
                        {0.7940, 0.0000, 1.0000},
                        {0.8000, 0.0000, 1.0000},
                        {0.8060, 0.0000, 1.0000},
                        {0.8120, 0.0000, 1.0000},
                        {0.8180, 0.0000, 1.0000},
                        {0.8240, 0.0000, 1.0000},
                        {0.8300, 0.0000, 1.0000},
                        {0.8360, 0.0000, 1.0000},
                        {0.8420, 0.0000, 1.0000},
                        {0.8480, 0.0000, 1.0000},
                        {0.8540, 0.0000, 1.0000},
                        {0.8600, 0.0000, 1.0000},
                        {0.8660, 0.0000, 1.0000},
                        {0.8720, 0.0000, 1.0000},
                        {0.8780, 0.0000, 1.0000},
                        {0.8840, 0.0000, 1.0000},
                        {0.8900, 0.0000, 1.0000},
                        {0.8960, 0.0000, 1.0000},
                        {0.9020, 0.0000, 1.0000},
                        {0.9080, 0.0000, 1.0000},
                        {0.9140, 0.0000, 1.0000},
                        {0.9200, 0.0000, 1.0000},
                        {0.9260, 0.0000, 1.0000},
                        {0.9320, 0.0000, 1.0000},
                        {0.9380, 0.0000, 1.0000},
                        {0.9440, 0.0000, 1.0000},
                        {0.9500, 0.0000, 1.0000},
                        {0.9560, 0.0000, 1.0000},
                        {0.9620, 0.0000, 1.0000},
                        {0.9680, 0.0000, 1.0000},
                        {0.9740, 0.0000, 1.0000},
                        {0.9800, 0.0000, 1.0000},
                        {0.9860, 0.0000, 1.0000},
                        {0.9920, 0.0000, 1.0000},
                        {0.9980, 0.0000, 1.0000},
                        {1.0000, 0.0000, 0.9960},
                        {1.0000, 0.0000, 0.9900},
                        {1.0000, 0.0000, 0.9840},
                        {1.0000, 0.0000, 0.9780},
                        {1.0000, 0.0000, 0.9720},
                        {1.0000, 0.0000, 0.9660},
                        {1.0000, 0.0000, 0.9600},
                        {1.0000, 0.0000, 0.9540},
                        {1.0000, 0.0000, 0.9480},
                        {1.0000, 0.0000, 0.9420},
                        {1.0000, 0.0000, 0.9360},
                        {1.0000, 0.0000, 0.9300},
                        {1.0000, 0.0000, 0.9240},
                        {1.0000, 0.0000, 0.9180},
                        {1.0000, 0.0000, 0.9120},
                        {1.0000, 0.0000, 0.9060},
                        {1.0000, 0.0000, 0.9000},
                        {1.0000, 0.0000, 0.8940},
                        {1.0000, 0.0000, 0.8880},
                        {1.0000, 0.0000, 0.8820},
                        {1.0000, 0.0000, 0.8760},
                        {1.0000, 0.0000, 0.8700},
                        {1.0000, 0.0000, 0.8640},
                        {1.0000, 0.0000, 0.8580},
                        {1.0000, 0.0000, 0.8520},
                        {1.0000, 0.0000, 0.8460},
                        {1.0000, 0.0000, 0.8400},
                        {1.0000, 0.0000, 0.8340},
                        {1.0000, 0.0000, 0.8280},
                        {1.0000, 0.0000, 0.8220},
                        {1.0000, 0.0000, 0.8160},
                        {1.0000, 0.0000, 0.8100},
                        {1.0000, 0.0000, 0.8040},
                        {1.0000, 0.0000, 0.7980},
                        {1.0000, 0.0000, 0.7920},
                        {1.0000, 0.0000, 0.7860},
                        {1.0000, 0.0000, 0.7800},
                        {1.0000, 0.0000, 0.7740},
                        {1.0000, 0.0000, 0.7680},
                        {1.0000, 0.0000, 0.7620},
                        {1.0000, 0.0000, 0.7560},
                        {1.0000, 0.0000, 0.7500},
                        {1.0000, 0.0000, 0.7440},
                        {1.0000, 0.0000, 0.7380},
                        {1.0000, 0.0000, 0.7320},
                        {1.0000, 0.0000, 0.7260},
                        {1.0000, 0.0000, 0.7200},
                        {1.0000, 0.0000, 0.7140},
                        {1.0000, 0.0000, 0.7080},
                        {1.0000, 0.0000, 0.7020},
                        {1.0000, 0.0000, 0.6960},
                        {1.0000, 0.0000, 0.6900},
                        {1.0000, 0.0000, 0.6840},
                        {1.0000, 0.0000, 0.6780},
                        {1.0000, 0.0000, 0.6720},
                        {1.0000, 0.0000, 0.6660},
                        {1.0000, 0.0000, 0.6600},
                        {1.0000, 0.0000, 0.6540},
                        {1.0000, 0.0000, 0.6480},
                        {1.0000, 0.0000, 0.6420},
                        {1.0000, 0.0000, 0.6360},
                        {1.0000, 0.0000, 0.6300},
                        {1.0000, 0.0000, 0.6240},
                        {1.0000, 0.0000, 0.6180},
                        {1.0000, 0.0000, 0.6120},
                        {1.0000, 0.0000, 0.6060},
                        {1.0000, 0.0000, 0.6000},
                        {1.0000, 0.0000, 0.5940},
                        {1.0000, 0.0000, 0.5880},
                        {1.0000, 0.0000, 0.5820},
                        {1.0000, 0.0000, 0.5760},
                        {1.0000, 0.0000, 0.5700},
                        {1.0000, 0.0000, 0.5640},
                        {1.0000, 0.0000, 0.5580},
                        {1.0000, 0.0000, 0.5520},
                        {1.0000, 0.0000, 0.5460},
                        {1.0000, 0.0000, 0.5400},
                        {1.0000, 0.0000, 0.5340},
                        {1.0000, 0.0000, 0.5280},
                        {1.0000, 0.0000, 0.5220},
                        {1.0000, 0.0000, 0.5160},
                        {1.0000, 0.0000, 0.5100},
                        {1.0000, 0.0000, 0.5040},
                        {1.0000, 0.0000, 0.4980},
                        {1.0000, 0.0000, 0.4920},
                        {1.0000, 0.0000, 0.4860},
                        {1.0000, 0.0000, 0.4800},
                        {1.0000, 0.0000, 0.4740},
                        {1.0000, 0.0000, 0.4680},
                        {1.0000, 0.0000, 0.4620},
                        {1.0000, 0.0000, 0.4560},
                        {1.0000, 0.0000, 0.4500},
                        {1.0000, 0.0000, 0.4440},
                        {1.0000, 0.0000, 0.4380},
                        {1.0000, 0.0000, 0.4320},
                        {1.0000, 0.0000, 0.4260},
                        {1.0000, 0.0000, 0.4200},
                        {1.0000, 0.0000, 0.4140},
                        {1.0000, 0.0000, 0.4080},
                        {1.0000, 0.0000, 0.4020},
                        {1.0000, 0.0000, 0.3960},
                        {1.0000, 0.0000, 0.3900},
                        {1.0000, 0.0000, 0.3840},
                        {1.0000, 0.0000, 0.3780},
                        {1.0000, 0.0000, 0.3720},
                        {1.0000, 0.0000, 0.3660},
                        {1.0000, 0.0000, 0.3600},
                        {1.0000, 0.0000, 0.3540},
                        {1.0000, 0.0000, 0.3480},
                        {1.0000, 0.0000, 0.3420},
                        {1.0000, 0.0000, 0.3360},
                        {1.0000, 0.0000, 0.3300},
                        {1.0000, 0.0000, 0.3240},
                        {1.0000, 0.0000, 0.3180},
                        {1.0000, 0.0000, 0.3120},
                        {1.0000, 0.0000, 0.3060},
                        {1.0000, 0.0000, 0.3000},
                        {1.0000, 0.0000, 0.2940},
                        {1.0000, 0.0000, 0.2880},
                        {1.0000, 0.0000, 0.2820},
                        {1.0000, 0.0000, 0.2760},
                        {1.0000, 0.0000, 0.2700},
                        {1.0000, 0.0000, 0.2640},
                        {1.0000, 0.0000, 0.2580},
                        {1.0000, 0.0000, 0.2520},
                        {1.0000, 0.0000, 0.2460},
                        {1.0000, 0.0000, 0.2400},
                        {1.0000, 0.0000, 0.2340},
                        {1.0000, 0.0000, 0.2280},
                        {1.0000, 0.0000, 0.2220},
                        {1.0000, 0.0000, 0.2160},
                        {1.0000, 0.0000, 0.2100},
                        {1.0000, 0.0000, 0.2040},
                        {1.0000, 0.0000, 0.1980},
                        {1.0000, 0.0000, 0.1920},
                        {1.0000, 0.0000, 0.1860},
                        {1.0000, 0.0000, 0.1800},
                        {1.0000, 0.0000, 0.1740},
                        {1.0000, 0.0000, 0.1680},
                        {1.0000, 0.0000, 0.1620},
                        {1.0000, 0.0000, 0.1560},
                        {1.0000, 0.0000, 0.1500},
                        {1.0000, 0.0000, 0.1440},
                        {1.0000, 0.0000, 0.1380},
                        {1.0000, 0.0000, 0.1320},
                        {1.0000, 0.0000, 0.1260},
                        {1.0000, 0.0000, 0.1200},
                        {1.0000, 0.0000, 0.1140},
                        {1.0000, 0.0000, 0.1080},
                        {1.0000, 0.0000, 0.1020},
                        {1.0000, 0.0000, 0.0960},
                        {1.0000, 0.0000, 0.0900},
                        {1.0000, 0.0000, 0.0840},
                        {1.0000, 0.0000, 0.0780},
                        {1.0000, 0.0000, 0.0720},
                        {1.0000, 0.0000, 0.0660},
                        {1.0000, 0.0000, 0.0600},
                        {1.0000, 0.0000, 0.0540},
                        {1.0000, 0.0000, 0.0480},
                        {1.0000, 0.0000, 0.0420},
                        {1.0000, 0.0000, 0.0360},
                        {1.0000, 0.0000, 0.0300},
                        {1.0000, 0.0000, 0.0240},
                        {1.0000, 0.0000, 0.0180},
                        {1.0000, 0.0000, 0.0120},
                        {1.0000, 0.0000, 0.0060}
                };
        return internal::CalcLerp(x, data);
    }

#if defined(TINYCOLORMAP_WITH_QT5) && defined(TINYCOLORMAP_WITH_EIGEN)
                                                                                                                            inline QImage CreateMatrixVisualization(const Eigen::MatrixXd& matrix)
    {
        const int w = matrix.cols();
        const int h = matrix.rows();
        const double max_coeff = matrix.maxCoeff();
        const double min_coeff = matrix.minCoeff();
        const Eigen::MatrixXd normalized = (1.0 / (max_coeff - min_coeff)) * (matrix - Eigen::MatrixXd::Constant(h, w, min_coeff));

        QImage image(w, h, QImage::Format_ARGB32);
        for (int x = 0; x < w; ++ x)
        {
            for (int y = 0; y < h; ++ y)
            {
                const QColor color = tinycolormap::GetColor(normalized(y, x)).ConvertToQColor();
                image.setPixel(x, y, color.rgb());
            }
        }

        return image;
    }

    inline void ExportMatrixVisualization(const Eigen::MatrixXd& matrix, const std::string& path)
    {
        CreateMatrixVisualization(matrix).save(QString::fromStdString(path));
    }
#endif
}

#endif
